标签:
基本的模板题,统计分子分母中p出现的次数,然后求逆元取模.
// // main.cpp // fzu2020 // // Created by 陈加寿 on 15/12/27. // Copyright (c) 2015年 chenhuan001. All rights reserved. // #include <iostream> #include <stdio.h> #include <string.h> #include <string> #include <stdlib.h> using namespace std; typedef long long ll; //ax + by = gcd(a,b) //传入固定值a,b.放回 d=gcd(a,b), x , y void extendgcd(ll a,ll b,ll &d,ll &x,ll &y) { if(b==0){d=a;x=1;y=0;return;} extendgcd(b,a%b,d,y,x); y-=x*(a/b); } //Ax=1(mod M),gcd(A,M)==1 //输入:10^18>=A,M>=1 //输出:返回x的范围是[1,M-1] ll GetNi(ll A,ll M) { ll rex=0,rey=0; ll td=0; extendgcd(A,M,td,rex,rey); return (rex%M+M)%M; } int main(int argc, const char * argv[]) { int T; cin>>T; while(T--) { int n,m,p; scanf("%d%d%d",&n,&m,&p); int cnt=0;//统计有多少个因子p long long up=1; for(int i=0;i<m;i++) { int tn = n-i; if( tn%p==0 ) { while( tn%p==0 ) { tn/=p; cnt++; } } up = (up*tn)%p; } long long dn=1; for(int i=1;i<=m;i++) { int tm=i; if( tm%p==0 ) { while(tm%p==0) { tm /= p; cnt--; } } dn = (dn*tm)%p; } if(cnt != 0) { printf("0\n"); continue; } cout << GetNi(dn, p)*up%p<<endl; } return 0; }
fzu2020( c(n,m)%p,其中n, m, p (1 <= m <= n <= 10^9, m <= 10^4, m < p < 10^9, p是素数) )
标签:
原文地址:http://www.cnblogs.com/chenhuan001/p/5081121.html