思路:暴力。
由于(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 #include2 #include 3 #include 4 #include 5 #include 6 #include 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