扩展欧几里得:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int mod=1e9+7;
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=1;i<=m;i++)
{
long long x,y;
exgcd(i,mod,x,y);
x=(x+mod)%mod;
ans=((ans%mod)*(x%mod))%mod;
}
printf("%lld\n",ans);
return 0;
}
费马小定理:
#include<iostream>
#include<cstdio>
using namespace std;
const long long mod=1e9+7;
long long ksm(long long a,long long b)
{
if(b==0) return 1;
long long ans=ksm(a,b/2);
ans=((ans%mod)*(ans%mod))%mod;
if(b%2==1)
{
ans=((ans%mod)*(a%mod))%mod;
}
return ans;
}
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=1;i<=m;i++)
{
long long r=ksm(i,mod-2);
r=(r+mod)%mod;
ans=((ans%mod)*(r%mod))%mod;
}
printf("%lld\n",ans);
return 0;
}
求欧拉函数:
#include<iostream>
#include<cstdio>
using namespace std;
int p[1000000+10];
int main()
{
p[1]=1;
for(int i=2;i<=1000000;i++)
{
if(p[i]) continue;
for(int j=i;j<=1000000;j+=i)
{
if(!p[j]) p[j]=j;
p[j]=p[j]/i*(i-1);
}
}
int n;
while(scanf("%d",&n)!=EOF)
{
printf("%d\n",p[n]);
}
return 0;
}