OTZ%%%子谦。大佬
又上了节课。。。俩题
计算系数 组合数问题。。。
要不是大佬指点就只能阶乘暴力算了
(主要还是我忘了杨辉三角)
杨辉三角与组合数C有着千丝万缕的联系,在计算,使用方面相当方便。
先说计算系数
计算系数
给定一个多项式(by+ax)^k,请求出多项式展开后x^n*y^m项的系数。
输出结果%10007
#include<bits/stdc++.h> using namespace std; long long k,a,b; long long n,m; long long t=1; long long c[1005][1005]; int main(){ cin>>a>>b>>k>>m>>n; c[0][0]=1; a=a%10007; b=b%10007; k=k%10007; n=n%10007; m=m%10007;//输入需要先取模,不然会很大 for(int i=1;i<=k;i++){ for(int j=1;j<=i;j++){ c[i][0]=1; c[i][j]=c[i-1][j]+c[i-1][j-1];//处理原理,杨辉三角 c[i][j]%=10007;//预处理,待会直接调用 } } for(int i=1;i<=m;i++){ t*=a; t%=10007; } for(int i=1;i<=n;i++){ t*=b; t%=10007; }//忘记*a*b很致命... cout<<(t%10007*c[k][n]%10007)%10007; return 0; }
组合数问题
给定 n,m 和 k,对于所有的 0≤i≤n,0≤j≤min(i,m) 有多少对 (i,j) 满足C 是 k的倍数。
#include<bits/stdc++.h> using namespace std; int k; int n,m; int t; int c[2005][2005]; int ans[2005][2005]; int main(){ scanf("%d%d",&t,&k); 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]+c[i-1][j-1])%k;//这里取模免去以后的判断 } } for(int i=1;i<=2000;i++){ for(int j=1;j<=i;j++){ ans[i][j]=ans[i-1][j]+ans[i][j-1]-ans[i-1][j-1];//前缀和,减去重复的 if(!c[i][j]) ans[i][j]++; } ans[i][i+1]=ans[i][i]; } for(int a=1;a<=t;a++){ scanf("%d%d",&n,&m); if(n<m) m=n; printf("%d\n",ans[n][m]); } return 0; }
同样杨辉三角
最后%下子谦。