标签:
思路:暴力。
由于(ak1*n+b1+bk2(n-1)+1)(modC)=0对于任意n为正整数恒成立,那么对于n=1成立可得(ak1+b1+b)(modC)=0;n =2时可得(a2*k1+b1+bk2+1)(modC)=0;
那么将n=1时所得的等式*ak1(modC)得(a2*k1+b1+b*ak1)(modC)=0;
那么和n=2时所得的式子比较可得(ak1)(modC)=(bk2)(modC);
那么由于1<=a,b<C;
那么从1循环到C枚举a,用快速幂求ak1,ak1+b1,用n=1时的等式求b,快速幂求bk2 ,判断是否(ak1)(modC)=(bk2)(modC);
下面证明;当a,b符合1,2式时,就(ak1*n+b1+bk2(n-1)+1)(modC)对于任意n为正整数恒成立。
1式可解得b=(C-(ak1+b1)modC);由1,2式得(ak1)(modC)=(bk2)(modC);
那么原式可改写为:(ak1*n+b1+ak1(n-1)*(C-(ak1+b1)modC))(modC)=0;
==(ak1*n+b1+ak1(n-1)*(C-(ak1+b1))(modC)=0
==(C*ak1(n-1))(modC)=0;
得证。
时间复杂度为(n*log(n));
1 #include<algorithm> 2 #include<stdlib.h> 3 #include<iostream> 4 #include<string.h> 5 #include<math.h> 6 #include<stdio.h> 7 typedef long long ll; 8 ll quick(ll x,ll y); 9 ll C; 10 using namespace std; 11 int main(void) 12 { 13 ll i,j,k,p,q; 14 int e=0; 15 while(scanf("%lld %lld %lld %lld",&C,&k,&p,&q)!=EOF) 16 {int flag=0; 17 e++; 18 printf("Case #%d:\n",e); 19 for(i=1;i<C;i++) 20 { 21 ll kk=quick(i,k);//a^k1, 22 ll k2=quick(i,k+p);//a^(k1+b1) 23 ll b=(C-k2);//b 24 ll z=quick(b,q);//b^k2; 25 if(z==kk) 26 {flag=1; 27 printf("%lld %lld\n",i,b); 28 } 29 } 30 if(flag==0) 31 { 32 printf("-1\n"); 33 34 } 35 36 } 37 return 0; 38 39 } 40 41 42 ll quick(ll x,ll y)//快速幂 43 { 44 ll i,j,k; 45 i=1; 46 k=x; 47 while(y) 48 { 49 if(y&1) 50 { 51 i=(i*k)%C; 52 } 53 k=(k*k)%C; 54 y/=2; 55 } 56 return i; 57 }
标签:
原文地址:http://www.cnblogs.com/zzuli2sjy/p/4976335.html