这一题考到了组合数。
我们要知道杨辉三角是可以求组合数的。
所以,这题用杨辉三角预处理一下就好。
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; int read(){ int t=1,num=0; char c=getchar(); while(c>'9'||c<'0'){if(c=='-')t=-1;c=getchar();} while(c>='0'&&c<='9'){num=num*10+c-'0';c=getchar();} return num*t; } const int mn=2005; int ans[mn+10][mn+10],yh[mn+10][mn+10]; int n,m,k,t; void init(){ memset(ans,0,sizeof(ans)); memset(yh,0,sizeof(yh)); yh[1][1]=1; for(int i=2;i<=mn;i++){ int h=0; for(int j=1;j<i;j++){ yh[i][j]=(yh[i-1][j-1]+yh[i-1][j])%k; if(!yh[i][j])h++; ans[i][j]=ans[i-1][j]+h; } yh[i][i]=1%k; ans[i][i]+=ans[i][i-1]; if(k==1)ans[i][i]++; } } int main() { t=read();k=read(); init(); for(int i=1;i<=t;i++){ n=read();m=read(); if(m>n)m=n; printf("%d\n",ans[n+1][m+1]); } return 0; }
本文由Yzyet编写,网址为www.cnblogs.com/Yzyet。非Yzyet同意,禁止转载,侵权者必究。