Fork me on GitHub

P1313 计算系数

https://www.luogu.org/problem/show?pid=1313
这里写图片描述

系数应该是a^n*b^m*c(n,m),主要是求c(n,m)
c(n,m)=n!/m!*(n-m)!
法1:
分解质因子

#include<cstdio>
#include<iostream>
int su[20000],yz[20000];
int n,m,k,a,b;
int p=10007;
void fen1(int q)
{
    int x=2;
    while(q>1)
    {
        while(q%x==0)
        {
            yz[x]++;
            q/=x;
        }
        x++;
    }   
}
void fen2(int q)
{
    int x=2,j=0;
    while(q>1)
    {
        while(q%x==0)
        {
            yz[x]--;
            q/=x;
        }
        x++;
    }   
}

int main()
{
    scanf("%d%d%d%d%d",&a,&b,&k,&n,&m);
    a=a%p;
    b=b%p;
    int ans=1;
    for(int i=1;i<=n;i++)
     ans=(ans*a)%p;
    for(int i=1;i<=m;i++)
     ans=(ans*b)%p;
    for(int i=2;i<=k;i++)
     fen1(i);
    for(int i=2;i<=n;i++)
     fen2(i);
    for(int i=2;i<=k-n;i++)
     fen2(i);
    for(int i=2;i<=k;i++)
     if(yz[i]>0)
     for(int j=1;j<=yz[i];j++)//!!
     {
        ans=(ans*i)%p;
     } 
    printf("%d",ans);
    return 0; 

} 

法2:
杨辉三角

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
#include<queue>
#include<string>
#include<map>
#define LL long long
#define mod 10007
using namespace std;
int a,b,k,n,m,ans;
int yh[1001][1001];
int fastpow(int a,int p)
{
    int b=1;
    while(p>1)
    {
        if(p%2==1)
            b=(b*a)%mod;
        a=(a*a)%mod;
        p/=2;
    }
    return (a*b)%mod;
}
int main()
{
    scanf("%d%d%d%d%d",&a,&b,&k,&n,&m);
    a%=mod;b%=mod;//!! 
    for(int i=0;i<=k;i++)
    {
        yh[i][0]=1;
        yh[i][i]=1;
    }
    for(int i=1;i<=k;i++)
    {
        for(int j=1;j<=i;j++)
        {
            yh[i][j]=(yh[i-1][j-1]+yh[i-1][j])%mod;
        }
    }
    ans=(((fastpow(a,n)*fastpow(b,m))%mod)*yh[k][n])%mod;
    printf("%d",ans);
    return 0;
} 
posted @ 2017-09-24 17:48  primes  阅读(86)  评论(0编辑  收藏  举报