组合数
来源:互联网 发布:淘宝夜店装 编辑:程序博客网 时间: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;}
阅读全文
3 0
- 组合数
- 组合数
- 组合数
- 组合数
- 组合数
- 组合数
- 组合数
- 组合数
- 组合数
- 组合数
- 组合数
- 组合数
- 组合数
- 组合数
- 组合数
- 组合数
- 组合数
- 组合数
- LinuxStudyNote(43)-图解Linux系统分区
- 刺杀
- some tips about python
- HDU 5521 Meeting
- 【Luogu3919】可持久化数组
- 组合数
- Swift开发指南:使用Swift与Cocoa和Objective-C(Swift 4)
- Bootstrap学习笔记——排版
- 关于atom插件下载难的问题
- uva 1151 Buy or Build
- div标签模拟textarea
- HDU 5510 Bazinga 多种姿势
- 看电影
- windows下redis的基本命令