其他分享
首页 > 其他分享> > [NOIP2011]计算系数——排列组合

[NOIP2011]计算系数——排列组合

作者:互联网

链接:https://ac.nowcoder.com/acm/problem/16596
来源:牛客网

题目描述
给定一个多项式(ax+by)k,请求出多项式展开后xnym项的系数。
输入描述:
共一行,包含5个整数,分别为a,b,k,n,m,每两个整数之间用一个空格隔开。
输出描述:
输出共1行,包含一个整数,表示所求的系数,这个系数可能很大,输出对10007取模后的结果。
示例1
输入

1 1 3 1 2

输出

3

解题思路 :
给定一个多项式
由公式可得求解系数可采用公式
c[k][n]*pow(a,n)*pow(b,m);

  1. 可采用预处理方式求解c[][]数组的值。
void yu()
{
    c[0][0]=0;
    c[1][1]=1;
    for(int i=1;i<=k;i++)
    {
        for(int j=0;j<=i;j++)
        {

            if(j==0||i==j)
                c[i][j]=1,c[i][j]%=mod;
            else
                c[i][j]=c[i-1][j-1]%mod+c[i-1][j]%mod;
        }
    }
}

2)利用fastpow(x,n)函数求解x^n。

LL fastpow(LL o,LL p)
{
   LL res=1;
    while(p)
    {
        if(p&1)
            res=res*o%mod;
        o=o*o%mod;
        p>>=1;
    }
    return res;
}

c++代码:

#include <iostream>
#include <bits/stdc++.h>
#include <cmath>
#define eps 1e-4
#define LL long long
using namespace std;
// 排列组合问题
const int mod = 10007;
const int maxn=2100;
int a,b,k,n,m;
int c[maxn][maxn]={0};

LL fastpow(LL o,LL p)
{

    LL res=1;
    while(p)
    {
        if(p&1)
            res=res*o%mod;
        o=o*o%mod;
        p>>=1;
    }
    return res;
}
void yu()
{
    c[0][0]=0;
    c[1][1]=1;
    for(int i=1;i<=k;i++)
    {
        for(int j=0;j<=i;j++)
        {

            if(j==0||i==j)
                c[i][j]=1,c[i][j]%=mod;
            else
                c[i][j]=c[i-1][j-1]%mod+c[i-1][j]%mod;
        }
    }
}
int main()
{

    while(~scanf("%d%d%d%d%d",&a,&b,&k,&n,&m))
    {
        for(int i=0;i<=k;i++)
        {
            
            c[i][0]=1;
        }
        yu();
        LL x1=fastpow(a,n);
        LL x2=fastpow(b,m);
        LL sum=c[k][m]%mod*x1%mod*x2%mod;
        printf("%lld\n",sum);
    }

}

标签:系数,NOIP2011,int,res,LL,d%,排列组合,fastpow,mod
来源: https://blog.csdn.net/a123321a1233211/article/details/118249171