p1313计算系数题解

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cctype>
#define ll long long
#define gc getchar
#define maxn 1005
#define mo 10007
using namespace std;

inline ll read(){//写一个快读函数
    ll a=0;int f=0;char p=gc();
    while(!isdigit(p)){f|=p=='-';p=gc();}
    while(isdigit(p)){a=(a<<3)+(a<<1)+(p^48);p=gc();}
    return f?-a:a;
}int n,m,k,a,b,f[maxn][maxn];

int pow(int a,int k){//快速幂函数
    int ans=1;
    while(k){
        if(k&1)ans=ans*a%mo;
        a=a*a%mo;k>>=1;
    }return ans;
}

int main(){f[0][0]=1;//杨辉三角初始化
    a=read()%mo;b=read()%mo;k=read();n=read();m=read();//%mo的原因是结果让mod10007,然而a,b的范围为1,000,000,所以要在开始取模
    for(int i=1;i<=k;++i){f[i][0]=1;
        for(int j=1;j<=i;++j)
            f[i][j]=(f[i-1][j-1]+f[i-1][j])%mo;//杨辉三角初始化,为了节省每一个输入样例的运算量
    }
    printf("%d
",f[k][n]*pow(a,n)%mo*pow(b,m)%mo);//根据二项式定理求展开式其中一项
    return 0;
}
原文地址:https://www.cnblogs.com/lbssxz/p/10561542.html