P1313 计算系数

//Pro:NOIP 2011 P1313 计算系数

//可以用杨辉三角来推
//但是,在这儿给出一个比较麻烦的解法:) 
//锻炼数学技巧233 
//sol:
//由二项式定理推出系数,当然了暴力乘的话肯定会炸的,而且不能取模 
//所以,把分子和分母上的数存下来,进行质因数分解约分
//质因数分解的话,先筛个素数 
//然后再做除法 
//然后让系数乘上x的系数a的n次方再乘上y的系数b的m次方
//快速幂搞 

#include<iostream>
#include<cmath>
#include<cstdio>
#include<algorithm>
using namespace std;

const int N=1e3+5;
const int mod=10007;

int a,b,k,n,m;
bool flag;

bool nprime[N];
int prime[N],cnt;
void init()
{
    nprime[1]=1;
    for(int i=2;i<N;++i)
    {
        if(!nprime[i])
            prime[++cnt]=i;
        for(int j=1,d;j<=cnt&&(d=prime[j]*i)<N;++j)
        {
            nprime[d]=1;
            if(i%prime[j]==0)
                break;
        }
    }
}

int p[2][N];

void fenjie(int num,int id)
{
    for(int i=1;i<=cnt&&num!=1;++i)
    {
        while(num%prime[i]==0)
        {
            ++p[id][prime[i]];
            num/=prime[i];
        }
    }
    if(num!=1)
        ++p[id][num];
}

long long ksm(long long x,int k)
{
    long long res=1;
    while(k)
    {
        if(k&1)
        {
            (res*=1ll*x)%=mod;
        }
        x*=x,x%=mod;
        k>>=1;
    }
    return res;
}

long long fenmu;

int main()
{
    init();
    scanf("%d%d%d%d%d",&a,&b,&k,&n,&m);
    if(n>m)
    {
        swap(n,m);
        flag=1;
    }
    for(int i=m+1;i<=k;++i)
        fenjie(i,0);
    for(int i=2;i<=n;++i)
        fenjie(i,1);
    for(int i=2;i<=k;++i)
    {
        p[0][i]-=p[1][i];
    }
    fenmu=1;
    for(int i=2;i<=k;++i)
    {
        if(p[0][i])
        {
            (fenmu*=ksm(i,p[0][i]))%=mod;
        }
    }
    if(flag)
        swap(n,m);
    (fenmu*=ksm(a,n))%=mod;
    (fenmu*=ksm(b,m))%=mod;
    printf("%lld",fenmu);
    return 0;
}

 

posted @ 2018-09-12 11:03  whymhe  阅读(199)  评论(0编辑  收藏  举报