计算系数

题目描述

给定一个多项式(by+ax)^k,请求出多项式展开后x^n * y^m 项的系数。

输入

共一行,包含5 个整数,分别为 a ,b ,k ,n ,m,每两个整数之间用一个空格隔开。0≤k≤1000, 0≤n,m≤k 且 n+m=k, 0≤a,b≤100,000

输出

输出共1 行,包含一个整数,表示所求的系数,这个系数可能很大,输出对10007 取模后的结果。

样例输入

1 1 3 1 2

样例输出

3


二项式展开式(牛顿二项式定理):

 

求逆元:费马小定理、拓展欧几里得

 

#include <iostream>
#include <bits/stdc++.h>
using namespace std;
const int mod=10007;

long long quickpow(long long a,long long b)
{
    if(b<0) return 0;
    long long ret=1;
    a%=mod;
    while(b)
    {
        if(b&1) ret =(ret*a)%mod;
        b>>=1;
        a = (a*a)%mod;
    }
    return ret;
}

long long inv(long long a)
{
    return quickpow(a,mod-2);
}

int main()
{
    int a,b,k,n,m;
    cin>>a>>b>>k>>n>>m;
    long long x1=1,x2=1;
    int temp=n;
    while(temp--)
    {
        x1 = ((x1%mod)*(a%mod))%mod;
    }
    temp = k-n;
    while(temp--)
    {
        x2 = ((x2%mod)*(b%mod))%mod;
    }
    long long y1=1,y2=1;
    for(int i=k;i>k-n;i--)
    {
        y1 =((y1%mod)*(i%mod))%mod;
    }
    for(int i=1;i<=n;i++)
    {
        y2 =((y2%mod)*(i%mod))%mod;
    }
    y2 = inv(y2);
    long long ans;
    long long y=y1*y2;
    if(n==0||n==k) y=1;
    ans = (((x1*x2)%mod)*(y%mod))%mod;
    cout<<ans<<endl;
    return 0;
}

 

posted @ 2018-03-20 12:43  Albert_liu  阅读(208)  评论(0编辑  收藏  举报