计算系数

题目链接

题意:给定一个多项式(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);
    }
 } 

 

posted @ 2019-08-09 18:14  Ldler  Views(507)  Comments(0Edit  收藏  举报