int main() { long long i,n,r,t,t1,t2,t3,t4,t5,crt; int cases,A,B; a[0][0]=1;a[0][1]=1; a[1][0]=1;a[1][1]=1; for(i=1;i<200007;i++){ a[i][0] = (i*a[i-1][0])%2; // printf("%d\n",a[i][0]); a[i][1] = (i*a[i-1][1])%500000003; } b_41[0][0]=1;b_41[0][1]=0; b_148721[0][0]=1;b_148721[0][1]=0; for(i=1;i<200007;i++){ t=i; b_41[i][1]=b_41[i-1][1]; while(t%41 == 0){t=t/41;b_41[i][1]++;} b_41[i][0] = (t*b_41[i-1][0])%1681; b_148721[i][0]=(i*b_148721[i-1][0])%148721; b_148721[i][1]=0; } // printf("\n"); scanf("%d",&cases); while(cases--) { scanf("%d %d %lld",&A,&B,&n); if(A==0 && B==0) { printf("1\n"); continue; } t3 = (a[2*n][0]*power(a[n][0],0,2))%2; t3 = (t3*power(a[n][0],0,2))%2; t4 = (b_41[2*n][0]*inverse2(b_41[n][0],1681))%1681; t4 = (t4*inverse2(b_41[n][0],1681))%1681; t4 = (t4*power(41,b_41[2*n][1]-2*b_41[n][1],1681))%1681; // printf("%lld",t4); // return 0; t5 = (b_148721[2*n][0]*power(b_148721[n][0],148719,148721))%148721; t5 = (t5*power(b_148721[n][0],148719,148721))%148721; //printf("t3=%lld t4=%lld t5=%lld\n",t3,t4,t5); crt = chinese_remainder_2(t3,t4,t5); t2 = power(B,crt,500000003); t1 = power(B,0,2); //printf("crt1=%lld t1=%lld t2=%lld\n",crt,t1,t2); // t2 = (a[2*n][1]*power(a[n][1],500000001,500000003))%500000003; // t2 = (t2*power(a[n][1],500000001,500000003))%500000003; // printf("%lld\n",t2); crt = chinese_remainder(t1,t2); //printf("A=%d crt = %d\n",A,crt); printf("%lld\n",power(A,crt,1000000007)); } return 0; }
int main() { //i64 result = binomial_mod(10000, 2200, 1009); //i64 result = chinese_remainder(7, 11, 13, 5, 7,3); //printf("%lld\n",result); //exit(1); int limit = 5000; vector<int> primes; primeWithin(primes, limit); //first find all primes between 1000 and 5000; vector<int> p15; for(unsigned int i = 0; i < primes.size(); ++i) { if(primes[i] > 1000) { assert(primes[i]< 5000); p15.push_back(primes[i]); } } //first calculate the number of p's in the product //in numerator and denominator vp18.resize(p15.size(), 0); for(unsigned int i = 0; i < p15.size(); ++i) vp18[i] = factor_p(p15[i], n18) - factor_p(p15[i], n18-n9)-factor_p(p15[i], n9); v18.resize(p15.size(), 0); for(unsigned int i = 0; i < p15.size(); ++i) { assert(vp18[i] >= 0); if(vp18[i] > 0) continue; else { // need to find out the mod v18[i] = binomial_mod(n18, n9, p15[i]); } } i64 sum = 0; for(unsigned int i = 0; i<p15.size(); ++i) for(unsigned int j = i+1; j < p15.size(); ++j) for(unsigned int k = j+1; k<p15.size(); ++k) { i64 t = chinese_remainder(p15[i], p15[j], p15[k], v18[i], v18[j], v18[k]); assert( t >= 0); sum += t; } printf("%lld\n", sum); }