Exemple #1
0
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);
}