hdu-3037-組合數取模-Lucas定理
阿新 • • 發佈:2019-02-09
http://acm.hdu.edu.cn/showproblem.php?pid=3037
題意很簡單 求C(n+m,m)%p,P是小於1e5的素數
n,m《1e18
那麼得到
#include <cstdio> #include <cmath> #include <cstring> #include <string> #include <algorithm> #include <queue> #include <map> #include <set> #include <vector> #include <iostream> using namespace std; long long mod =1000000007; long long fast_m(long long a,long long b) { long long x,ans=1; x=a; while(b) { if (b&1) ans=(ans*x)%mod; x=(x*x)%mod; b/=2; } return ans%mod; } long long fac[100005]; long long Lucas(long long n,long long m,long long p) { long long ret=1; while(n&&m) { long long a=n%p,b=m%p; if(a<b) return 0; ret=(ret*fac[a]*fast_m(fac[b]*fac[a-b]%p,p-2))%p; n/=p; m/=p; } return ret; } int main() { long long i; int t; cin>>t; while(t--) { long long n,m; cin>>n>>m>>mod; fac[0]=1; for( i=1; i<=mod; i++) fac[i]=fac[i-1]*i%mod; printf("%lld\n",Lucas(n+m,m,mod)); } return 0; }