【递推】【NOIP2011提高组】计算系数

根据二项式定理,(ax+by)^n的x^ny^m系数为a^nb^m*C(n,k),其中C(k,n)可通过递推获取。d[i][j]=d[i-1][j-1]+d[i-1][j]。结合二分快速幂求a^n和b^m,解决NOIP2011提高组的计算问题。" 114335385,10547495,MySQL 创建与移除自定义服务端口教程,"['数据库管理', 'MySQL服务', '端口配置']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【问题描述】
这里写图片描述
由二项式定理可知(x+y)^n=C(n,1)*x^1*y^n+C(n,2)*x^2*y^(n-1)+…+C(1,n)*x^n*y+x^k+y^k。(其中x,y为实数,C(x,y)代表从有x个元素的集合中选择含有y个元素的组合的组合数。)
将上式中x,y换成ax,by,得到x^ny^m的系数是a^nb^m*C(k,n)。
C(k,n)可以用递推得到(当然也可以写数学公式,只是不好取模)。
设d[i][j]为C(i,j) d[i][j]=d[i-1][j-1]选+d[i-1][j]不选.
a^n,b^m直接二分快速幂就行了。(也可以暴力)

#include<cstdio>
#include<iostream>
#include<queue>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<vector>
#define mo 10007
using namespace std;
typedef long long LL;
int a,b,k,n,m;
int d[1005][1005];
LL getckn(int k,int n)
{
    memset(d,0,sizeof(d));
    for(int i=0;i<=k;i++)
    d[i][0]=1;

    for(int i=1;i<=k;i++)
    for(int j=1;j<=n;j++)
    d[i][j]=(d[i-1][j]%mo+d[i-1][j-1]%mo)%mo;


    /*for(int i=1;i<=k;i++)
    {
    for(int j=1;j<=n;j++)
    printf("%d ",d[i][j]);
    printf("\n");
    }*/


    return d[k][n];
}

LL qkpw(int a,int b)
{
    LL ans=1,t=a;
    while(b>0)
    {
        if(b&1)ans=ans*t%mo;
        t=t*t%mo;
        b=b>>1;
    }
    return ans;
}


int main()
{
    //freopen("my.in","r",stdin);
    //freopen("my.out","w",stdout);

    scanf("%d%d%d%d%d",&a,&b,&k,&n,&m);

    LL a1=getckn(k,n);
    LL a2=qkpw(a,n);
    LL a3=qkpw(b,m);

    LL ans=((a1%mo*a2%mo)*(a3%mo))%mo;

    cout<<ans<<endl;

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值