洛谷2822 組合數問題(楊輝三角)
阿新 • • 發佈:2018-11-11
傳送門
【題目分析】
不得不說NOIP DAY2還是有點東西啊。。。。。。
考慮組合數的計算:,又有,那麼就根據這個打印出前5行組合數:
眼熟的感覺。。。。沒錯這就是楊輝三角。。。。。
所以在預處理2000*2000的楊輝三角的時候記錄一下當前列有多少為k的倍數,然後直接O(1)詢問即可。
PS:注意m可能大於n所以輸出時取個較小值即可
【程式碼~】
#include<bits/stdc++.h> using namespace std; const int MAXN=2e3+10; int T,k; int n,m; int c[MAXN][MAXN],ans[MAXN][MAXN],cnt[MAXN]; int Read(){ int i=0,f=1; char c; for(c=getchar();(c>'9'||c<'0')&&c!='-';c=getchar()); if(c=='-') f=-1,c=getchar(); for(;c>='0'&&c<='9';c=getchar()) i=(i<<3)+(i<<1)+c-'0'; return i*f; } void pre(){ for(int i=0;i<=2000;++i) c[i][0]=1; for(int i=1;i<=2000;++i){ for(int j=1;j<=i;++j){ c[i][j]=(c[i-1][j-1]+c[i-1][j])%k; if(!c[i][j]) cnt[j]++; ans[i][j]=ans[i][j-1]+cnt[j]; } } } int main(){ T=Read(),k=Read(); pre(); while(T--){ n=Read(),m=Read(); cout<<ans[n][min(m,n)]<<'\n'; } return 0; }