计算系数


 思路:

DP做法,但考试时死活没想到如何来模拟这样的多项式

f[i][j] 表示 xyj 的系数,所以你可以发现,k并没有用,因为给了你要求的 xym  ,一直往后推出到答案就好啦

样例解释:1 1 3 1 2 

f[0][1]=0
f[0][0]=1

f[0][2]=0
f[0][1]=1

f[1][0]=0
f[0][0]=1

f[1][1]=0
f[0][1]=1

f[1][1]=1
f[1][0]=1

f[1][2]=0
f[0][2]=1

f[1][2]=1
f[1][1]=2

因为后面的状态全靠之前的状态推出,完全符合 DP 的思想

代码

#include<stdio.h>
const int MX=10001,P=10007;
long long f[MX][MX];
int a,b,k,n,m;

int main()
{
    scanf("%d%d%d%d%d",&a,&b,&k,&n,&m);
    f[0][0]=1;
    for(int i=0;i<=n;++i) 
    {
        for(int j=0;j<=m;++j)
        {
            if(i>0) 
                f[i][j]=(f[i][j]+f[i-1][j]*a)%P;
            if(j>0) 
                f[i][j]=(f[i][j]+f[i][j-1]*b)%P;    
        }
    }
    printf("%lld",f[n][m]);
    return 0;
}

updated:2018-10-25

现在才发现这是道裸的二项式定理,k其实是有用的,因为 x的次方加上 y的次方 = k

这就告诉你了这在杨辉三角的哪一行,预处理推出,加上快速幂求 an*bm

相乘就是答案啦~

code

#include<stdio.h> 
#include<algorithm> 
using namespace std;
const int mxn=1010,P=10007;
long long a,b,k,n,m;
long long c[mxn][mxn];

long long ksm(long x,long d) {
    long long re=1;
    while(d) {
        if(d&1) re=re*x%P;
        x=x*x%P;
        d>>=1;
    }
    return re;
}

int ycl() {
    c[1][1]=1;
    for(int i=0;i<=1000;++i) c[i][0]=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])%P;
        }
    }
} 

int main() 
{
    ycl();
    scanf("%lld%lld%lld%lld%lld",&a,&b,&k,&n,&m);
    a%=P,b%=P;
    long long ans=ksm(a,n)*ksm(b,m)*c[k][n]%P;
    printf("%lld",ans);
    return 0;
}
从0到1很难,但从1到100很容易
原文地址:https://www.cnblogs.com/qseer/p/9594271.html