簡單求組合數(除法取模)
阿新 • • 發佈:2018-12-20
#include<bits/stdc++.h> using namespace std; #define inf 0x3f3f3f3f const int maxn=1e5+9; #define LL long long int e_gcd(int a,int b,int & x,int &y){ if(!b){ x=1; y=0; return a; } int gcd=e_gcd(b,a%b,y,x); y-=x*a/b; return gcd; } int inv(int a,int mod){ int x,y; int d=e_gcd(a,mod,x,y); if(d!=1)return -1; int ans=(x%mod+mod)%mod; return ans; } LL C(LL n,LL m,LL mod){ if(m<0)return 0; else if(m>n)return 0; if(m>n-m)m=n-m; LL up=1,down=1; for(int i=0;i<m;i++){ up=up*(n-i)%mod; down=down*(i+1)%mod; } if(inv(down,mod)==-1){ return up%(down*mod)/down; } else return up*inv(down,mod)%mod; } int main(){ int n,m,mod; cin>>n>>m>>mod; //cout<<inv(n,m)<<endl; cout<<C(n,m,mod)<<endl; }