1. 程式人生 > >51nod 1161 組合數,規律

51nod 1161 組合數,規律

clas printf html blank == names using pan sca

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1161

顯然,題目可以轉化為矩陣求解,但復雜度顯然時空都不允許,我們如果自己把這個N*N矩陣的前幾項列出來的話就會發現和楊輝三角的某一部分相似,

對照一下發現這個矩陣的第一行對應的就是楊輝三角的某一斜列,依次向下遞減,也就是說我們只要知道這幾個組合數,就能推導出來這個矩陣。

對於每一個K,對應的矩陣首行元素就是 : C(k-1,0),C(k,1),C(k+1,2).......C(n+k-2,n-1),

mod這麽大,N也這麽大,lucas顯然不能用了,通過觀察發現這一行有個規律就是 C(n,r),C(n+1,r+1),C(n+2,r+2)......

我們可以找到每一項之間的遞推關系這樣也能解決, C(n+1,r+1)=C(n,r)*(n+1)/(r+1) ,第一項永遠是一直接遞推求解就好了。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define LL long long
 4 LL mod=1e9+7;
 5 void gcd(LL a,LL b,LL &d,LL &x,LL &y)
 6 {
 7     if(!b) {d=a;x=1;y=0;}
 8     else {gcd(b,a%b,d,y,x);y-=x*(a/b);}
 9
} 10 LL Inv(LL a,LL n) 11 { 12 LL d,x,y; 13 gcd(a,n,d,x,y); 14 return d==1?(x+n)%n:-1; 15 } 16 17 int main() 18 { 19 LL N,K,a[5005],b[5005]={1,1}; 20 cin>>N>>K; 21 for(int i=1;i<=N;++i) scanf("%lld",&a[i]); 22 LL n=K,r=1,i=2; 23 for(i=2;i<=N;++i,++n,++r)
24 b[i]=b[i-1]*n%mod*Inv(r,mod)%mod; 25 for(int len=1;len<=N;++len) 26 { 27 LL ret=0,i=1,j=len; 28 for(;i<=len;++i,--j) 29 ret=(ret+a[i]*b[j]%mod)%mod; 30 printf("%lld\n",ret); 31 } 32 return 0; 33 }

51nod 1161 組合數,規律