JZOJ5922. 【NOIP2018模拟10.23】sequence
生活随笔
收集整理的這篇文章主要介紹了
JZOJ5922. 【NOIP2018模拟10.23】sequence
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
傳送門
preface
這道題想了好久好久主要是菜,但其實并不是很難,大佬現在走還來得及。。。。
分析
這道題乍一看沒什么想法,暴力50pts騙走溜掉。但其實那個特殊點提示很大。
對于第5個點的話,把式子化簡出來就是i-l+1,i-l+2...就這個點而言,就可以開兩個差分數組f,g,分別表示第i個位置的一次項系數和常數的差分。更新就變成了O(1)的。
再把差分擴展到20,也不過是個二十一階差分嘛。然后,對于每i階的差分來說,都要做i次才能得到真正的值,而多次差分的數列正好對應帕斯卡矩陣的r-l+1行/列,也就是楊輝三角的r-l+1列,也就是一個組合數。所以對于每個修改,在l的對應階的差分數組上++,r+1的--,然后在r+1處向低階減k個組合數從而保證其他階不變。
最后更新答案時一定要從高階往低階更新,這樣才能保證每i階都差分了i次,注意逆元和月莫就可以了。
p.s.我用預處理帕斯卡矩陣掛了后三個點??如果你用帕斯卡矩陣過了的話請留個評論。
code
?
#include<bits/stdc++.h> #define ll long long #define maxn 500010 #define reg register #define mod 1000000007 using namespace std; inline void read(int &x) {x=0;reg char s=getchar();while(s<'0' || s>'9') s=getchar();while(s>='0' && s<='9') x=x*10+s-'0',s=getchar(); } inline void print(ll x) {if(x<0){putchar('-');x=-x;}if(x>9) print(x/10ll);putchar(x%10ll+'0'); } int n,m; ll a[maxn][25],b[maxn][25],inv[maxn]; void pre() {inv[1]=1;for(int i=2; i<=n; i++) inv[i]=(mod-mod/i)*inv[mod%i]%mod; } int main() {read(n),read(m);pre();reg int l,r,k;for(reg int i=1; i<=m; i++){read(l),read(r),read(k);a[l][k]=(a[l][k]+1)%mod;ll tmp=1,t=r-l;for(reg int j=k; ~j; j--){a[r+1][j]=(a[r+1][j]-tmp+mod)%mod;t++;tmp=tmp*t%mod*inv[t-(r-l)]%mod;}}for(reg int i=20; ~i; i--)for(reg int j=1; j<=n; j++)b[j][i]=((a[j][i]+b[j][i+1])%mod+b[j-1][i])%mod;for(reg int i=1; i<=n; i++) print(b[i][0]),putchar('\n');return 0; }轉載于:https://www.cnblogs.com/wCTSd/p/9846285.html
總結
以上是生活随笔為你收集整理的JZOJ5922. 【NOIP2018模拟10.23】sequence的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 结对项目-四则运算 “软件”之升级版
- 下一篇: drf解决跨域问题 使用 django-