hdu-5478 Can you find it(快速幂)

本文介绍了一种通过暴力枚举方法解决特定形式方程 (ak1*n+b1+bk2(n-1)+1)(modC)=0 的算法实现。通过对不同参数a和b的循环枚举,并利用快速幂计算,验证了(a^k1)≡(b^k2)(mod C)条件下的方程对于所有正整数n是否恒成立。

 

思路:暴力。

由于(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 }

 

转载于:https://www.cnblogs.com/zzuli2sjy/p/4976335.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值