nefu 628 Garden visiting
//yy:想到昨天一个神题整了几个小时,最后按题解把p拆了用孙子定理、、今天这个简单,把C暴力拆了。。
1 <= n, m, p <= 10^5
题意:给出n*m的矩形,求从左上角到右下角的路径数(对p取模)。
题解:答案就是C(m+n-2, m-1),但是不能杨辉三角,而且考虑到p可能为合数、、再看看这个数据范围,可以暴力进行素因子分解哇。。。
1 #include<cstdio> 2 using namespace std; 3 const int N = 2e5+5; 4 typedef long long ll; 5 ll n, m, P, a, b, c, sum, ans; 6 ll pow(ll a,ll b,ll p){for(sum=1,a%=p;b;a=a*a%p,b>>=1)if(b&1)sum=sum*a%p;return sum;} 7 ll Cnt(ll n, ll p){ll num=0;while(n)num+=n/p,n/=p;return num;} 8 bool prime[N]; 9 int p[N], tot, t, i, j; 10 void init(){for(i=2;i<N;i++)prime[i]=true;for(i=2;i<N;i++){if(prime[i])p[tot++]=i; 11 for(j=0;j<tot&&i*p[j]<N;j++){prime[i*p[j]]=false;if(i%p[j]==0)break;}}} 12 int main(){ 13 init(); 14 scanf("%d", &t); 15 while(t--) { 16 scanf("%lld%lld%lld", &n, &m, &P); 17 n += (m - 2); m--; 18 for(ans = 1, i = 0; i < tot && p[i] <= n; ++i) { 19 a = Cnt(n, p[i]); b = Cnt(m, p[i]); c = Cnt(n-m, p[i]); 20 a -= (b + c); 21 ans = ans * pow(p[i], a, P) % P; 22 } 23 printf("%lld\n", ans); 24 } 25 return 0; 26 }