计算系数
题意:给定一个多项式(ax+by)^k,请求出多项式展开后x^n*y^m项的系数。
思路:系数是 C(n,k)*a^n*b^m
a^n和b^m用快速幂求,然后求组合数有两种思路。
因为k只有1000,所以杨辉三角打表
#include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<map> #include<queue> #include<vector> #include<string> #define ll long long using namespace std; const int mod=10007; ll c[1011][1011]; ll power(ll a,ll b) { ll c=1; for(;b;b>>=1) { if(b&1) c=(ll)c*a%mod; a=(ll)a*a%mod; } return c%mod; } int main() { ll n,m,k,a,b; for(int i=0;i<=1000;i++) { c[i][0]=1; } c[1][1]=1; for(int i=2;i<=1000;i++) { for(int j=1;j<=i;j++) { c[i][j]=(c[i-1][j]+c[i-1][j-1])%mod; } } while(~scanf("%lld%lld%lld%lld%lld",&a,&b,&k,&n,&m)) { ll m1=power(a,n); ll m2=power(b,m); ll m=m1*m2%mod; ll ans=m*c[k][n]%mod; printf("%lld\n",c[k][n]); printf("%lld\n",ans); } }
然后如果k比较大,就可以用求n!逆元的方法
#include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<map> #include<queue> #include<vector> #include<string> #define ll long long using namespace std; const int mod=10007; ll jc[10010]; ll jc_inv[10010]; ll power(ll a,ll b) { ll c=1; for(;b;b>>=1) { if(b&1) c=(ll)c*a%mod; a=(ll)a*a%mod; } return c%mod; } int main() { jc[0]=1; for(int i=1;i<=1000;i++) { jc[i]=(jc[i-1]*i)%mod; } jc_inv[1000]=power(jc[1000],mod-2)%mod; for(int i=999;i>=0;i--) { jc_inv[i]=(jc_inv[i+1]*(i+1))%mod; // jc_inv[i]=power(jc[i],mod-2)%mod; } ll a,b,k,n,m; while(~scanf("%lld%lld%lld%lld%lld",&a,&b,&k,&n,&m)) { ll m1=power(a,n); ll m2=power(b,m); ll p=m1*m2%mod; ll c=((jc[k]*jc_inv[n])%mod)*jc_inv[m]%mod; //printf("%lld\n",c); ll ans=c*p%mod; printf("%lld\n",ans); } }