51nod 1161 Partial Sums
阿新 • • 發佈:2017-10-28
str put aps efi out color 處理 一定的 bsp
給出一個數組A,經過一次處理,生成一個數組S,數組S中的每個值相當於數組A的累加,比如:A = {1 3 5 6} => S = {1 4 9 15}。如果對生成的數組S再進行一次累加操作,{1 4 9 15} => {1 5 14 29},現在給出數組A,問進行K次操作後的結果。(每次累加後的結果 mod 10^9 + 7)
Input
第1行,2個數N和K,中間用空格分隔,N表示數組的長度,K表示處理的次數(2 <= n <= 5000, 0 <= k <= 10^9, 0 <= a[i] <= 10^9)
Output
共N行,每行一個數,對應經過K次處理後的結果。每次累加後mod 10^9 + 7。Input示例
4 2
1
3
5
6
Output示例
1
5
14
29
————————————————————————
這題我們單獨考慮矩陣乘法 我們發現 這個矩陣大概是長這樣的
1 1 1 .... 1
0 1 1 ..... 1
0 0 1 ..... 1
0 0 0 ..... 1
然後觀察發現 我們可以通過第一行直接推出下面的所有行
我們再考慮發現第一行每一位滿足一定的條件
第i個=C(k+i-1,i-1)然後就可以nlogn+n^2直接推出最後的矩陣
然後在n^2矩陣乘法直接推出答案辣
#include<cstdio> #include<cstring> #include<algorithm> #defineView CodeLL long long const int M=5e3+7,mod=1e9+7; int read(){ int ans=0,f=1,c=getchar(); while(c<‘0‘||c>‘9‘){if(c==‘-‘) f=-1; c=getchar();} while(c>=‘0‘&&c<=‘9‘){ans=ans*10+(c-‘0‘); c=getchar();} return ans*f; } int n,k; int s[M],ans[M]; int b[M][M]; LL inv(LL a,LL b){ LL ans=1; while(b){ if(b&1) ans=ans*a%mod; b>>=1; a=a*a%mod; }return ans; } int main(){ n=read(); k=read()-1; for(int i=1;i<=n;i++) s[i]=read()%mod; b[1][1]=1; for(int i=1;i<n;i++) b[1][i+1]=1LL*b[1][i]*(k+i)%mod*inv(i,mod-2)%mod; //for(int i=1;i<=n;i++) printf("[%d] ",b[1][i]); puts(""); for(int i=2;i<=n;i++){ int cnt=0; for(int j=i;j<=n;j++) b[i][j]=b[1][++cnt]; } // for(int i=1;i<=n;i++,puts("")) for(int j=1;j<=n;j++) printf("[%d] ",b[i][j]); for(int i=1;i<=n;i++)for(int j=1;j<=n;j++) ans[i]=(ans[i]+1LL*s[j]*b[j][i]%mod)%mod; for(int i=1;i<=n;i++) printf("%d\n",ans[i]); return 0; }
51nod 1161 Partial Sums