组合数

来源:互联网 发布:淘宝夜店装 编辑:程序博客网 时间:2024/06/08 13:48

题意:求n个数里取m个数,问在模1e9+7下的种数。

逆元:

#include<iostream>#include<cstdio>using namespace std;const long long mod=1000000000+7;long long a,b,x,y;void exgcd(long long a,long long b,long long &x,long long &y){    if(b==0)    {        x=1,y=0;        return;    }    exgcd(b,a%b,x,y);    long long t=x;    x=y,y=t-a/b*y;}int main(){    long long n,m;    scanf("%lld%lld",&n,&m);    long long ans=1;    for(long long i=n;i>=n-m+1;i--)    {        ans=((ans%mod)*(i%mod))%mod;    }    for(long long i=2;i<=m;i++)    {        exgcd(i,mod,x,y);        long long hh=(x+mod)%mod;        ans=((ans%mod)*(hh%mod))%mod;    }    printf("%lld",ans);    return 0;}

费马小定理:

#include<iostream>#include<cstdio>using namespace std;const long long mod=1000000000+7;long long a[200000+10];long long ny[200000+10];long long ksm(long long x,long long y){    if(y==0)    {        return 1;    }    long long ans=ksm(x,y/2);    ans=((ans%mod)*(ans%mod))%mod;    if(y%2==1)    {        ans=((ans%mod)*(x%mod))%mod;    }    return ans;}int main(){    long long n,m;    scanf("%lld%lld",&n,&m);    a[0]=1;    ny[0]=1;    for(long long i=1;i<=n;i++)    {        a[i]=((a[i-1]%mod)*(i%mod))%mod;        ny[i]=ksm(a[i],mod-2);    }    long long ans=((a[n]*ny[m]%mod)*(ny[n-m])%mod;    printf("%lld\n",ans);    return 0;}

分解质因数:

#include<iostream>#include<cstdio>#include<cstring>using namespace std;long long mod=1000000000+7;long long a[200000+10];bool p[400000+10];long long num[200000+10];long long cnt=0;void is_prime(){    memset(p,1,sizeof(p));    p[0]=p[1]=0;    for(long long i=2;i<=200000;i++)    {        if(p[i])        {            cnt++;            a[cnt]=i;            for(long long j=i+i;j<=200000;j+=i)            {                p[j]=0;            }        }    }}void del1(long long x){    for(long long i=1;i<=cnt;i++)    {        if(x<2)        {            break;        }        while(x%a[i]==0)        {            num[i]++;            x/=a[i];        }    }}void del2(long long x){    for(long long i=1;i<=cnt;i++)    {        if(x<2)        {            break;        }        if(x%a[i]==0)        {            while(x%a[i]==0)            {                num[i]--;                x/=a[i];            }        }    }}long long ksm(long long x,long long y){    if(y==0)    {        return 1;    }    long long ans=ksm(x,y/2);    ans=((ans%mod)*(ans%mod)%mod);    if(y%2==1)    {        ans=((ans%mod)*(x%mod))%mod;    }    return ans;}int main(){    long long n,m;    scanf("%lld%lld",&n,&m);    is_prime();    for(long long i=n;i>=n-m+1;i--)    {        del1(i);    }    for(long long i=1;i<=m;i++)    {        del2(i);    }    long long ans=1;    for(long long i=1;i<=cnt;i++)    {        if(!num[i])        {            continue;        }        ans=((ans%mod)*(ksm(a[i],num[i]))%mod)%mod;    }    printf("%lld",ans);    return 0;}