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; }
GF2m& GF2m::operator/=(const GF2m& b) { GF2m z=b; inverse2(z.fn,z.fn); modmult2(fn,z.fn,fn); return *this; }
GF2m operator/(const GF2m& b1,const GF2m& b2) { GF2m abb; inverse2(b2.fn,abb.fn); modmult2(b1.fn,abb.fn,abb.fn); return abb; }
int chinese_remainder_2(long long n1,long long n2,long long n3) { int p1=2,p2=1681,p3=148721; long long m1,m2,m3; long long i1,i2,i3; long long m; int ans; m = p1*p2*p3; m1 = m/p1;m2=m/p2;m3=m/p3; i1 = inverse(m1,p1);i2=inverse2(m2,p2);i3=inverse(m3,p3); //printf("i1 = %lld i2 = %lld\n",i1,i2); ans = (n1*m1*i1)%m+(n2*m2*i2)%m + (n3*m3*i3)%m ; ans = ans%m; return ans; //printf("%d\n",ans); }
int main(int argc, char **argv) { double a = 1234.0; double b; double r2,r3,r4,r5; b = 1.0 / a; r2 = inverse2(a); r3 = inverse3(a); r4 = inverse4(a); r5 = inverse5(a); printf(" a = %5.16lf\n", a); printf("true 1/a = %5.16lf\n", b); printf(" r2 = %5.16lf\n", r2); printf(" r3 = %5.16lf\n", r3); printf(" r4 = %5.16lf\n", r4); printf(" r5 = %5.16lf\n", r5); return 0; }
GF2m inverse(const GF2m& b) { GF2m r=b; inverse2(r.fn,r.fn); return r; }
void invert(_MIPD_ big *x) { int degF,degG,degB,degC,d,i,j; big alpha,beta,gamma,BB[4],FF[5],CC[4],GG[5],t; big *BP=BB,*CP=CC,*FP=FF,*GP=GG,*TP; #ifndef MR_STATIC char *mem=(char *)memalloc(_MIPP_ 22); #else char mem[MR_BIG_RESERVE(22)]; /* 972 bytes from the stack */ memset(mem,0,MR_BIG_RESERVE(22)); #endif alpha=mirvar_mem(_MIPP_ mem,0); beta=mirvar_mem(_MIPP_ mem,1); gamma=mirvar_mem(_MIPP_ mem,2); t=mirvar_mem(_MIPP_ mem,3); for (i=0;i<4;i++) BB[i]=mirvar_mem(_MIPP_ mem,4+i); for (i=0;i<5;i++) FF[i]=mirvar_mem(_MIPP_ mem,8+i); for (i=0;i<4;i++) CC[i]=mirvar_mem(_MIPP_ mem,13+i); for (i=0;i<5;i++) GG[i]=mirvar_mem(_MIPP_ mem,17+i); convert(_MIPP_ 1,CP[0]); convert(_MIPP_ 1,FP[0]); convert(_MIPP_ 1,FP[1]); convert(_MIPP_ 1,FP[4]); /* F = x^4+x+1 - irreducible polynomial for GF(2^{4m}) */ degF=4; degG=degree(x); degC=0; degB=-1; if (degG==0) { inverse2(_MIPP_ x[0],x[0]); return; } for (i=0;i<4;i++) { fcopy2(x[i],GP[i]); zero(x[i]); } while (degF!=0) { if (degF<degG) { /* swap */ TP=FP; FP=GP; GP=TP; d=degF; degF=degG; degG=d; TP=BP; BP=CP; CP=TP; d=degB; degB=degC; degC=d; } j=degF-degG; modsquare2(_MIPP_ GP[degG],alpha); modmult2(_MIPP_ FP[degF],GP[degG],beta); modmult2(_MIPP_ GP[degG],FP[degF-1],t); modmult2(_MIPP_ FP[degF],GP[degG-1],gamma); fincr2(t,gamma); zero(t); for (i=0;i<=degF;i++ ) { modmult2(_MIPP_ FP[i],alpha,FP[i]); if (i>=j-1) { modmult2(_MIPP_ gamma,GP[i-j+1],t); fincr2(t,FP[i]); } if (i>=j) { modmult2(_MIPP_ beta,GP[i-j],t); fincr2(t,FP[i]); } } for (i=0;i<=degB || i<=(degC+j);i++) { modmult2(_MIPP_ BP[i],alpha,BP[i]); if (i>=j-1) { modmult2(_MIPP_ gamma,CP[i-j+1],t); fincr2(t,BP[i]); } if (i>=j) { modmult2(_MIPP_ beta,CP[i-j],t); fincr2(t,BP[i]); } } while (degF>=0 && size(FP[degF])==0) degF--; if (degF==degG) { fcopy2(FP[degF],alpha); for (i=0;i<=degF;i++) { modmult2(_MIPP_ FP[i],GP[degF],FP[i]); modmult2(_MIPP_ alpha,GP[i],t); fincr2(t,FP[i]); } for (i=0;i<=4-degF;i++) { modmult2(_MIPP_ BP[i],GP[degF],BP[i]); modmult2(_MIPP_ CP[i],alpha,t); fincr2(t,BP[i]); } while (degF>=0 && size(FP[degF])==0) degF--; } degB=3; while (degB>=0 && size(BP[degB])==0) degB--; } inverse2(_MIPP_ FP[0],alpha); for (i=0;i<=degB;i++) modmult2(_MIPP_ alpha,BP[i],x[i]); #ifndef MR_STATIC memkill(_MIPP_ mem,22); #else memset(mem,0,MR_BIG_RESERVE(22)); #endif }