题意

输入正整数 $K_1$($K_1 \leq 50000$),找一个12为正整数 $K_2$(不能含有前导0)使得 ${K_1}^{K_2} \equiv K_2(mod \ {10}^{12})$。例如 $K_1=99$,$K_2=817 \ 245\ 479\ 899\ $.

分析

1、利用自相似性质

如果 ${K_1}^{K_2} \equiv K_2(mod \ {10}^{12})$,那么有 ${K_1}^{K_2 \% {10}^i} \equiv K_2\% {10}^i(mod \ {10}^{i}), \ i \leq 12$.

因此可以dfs从后往前一位一位得到。

考虑到不能含有前导0,可以求到13位,并要求大于等于1e12,答案再模1e12,这样就不会出现前导0.

#include<bits/stdc++.h>
using namespace std; typedef long long ll;
const ll mod = 1e12;
ll K1, K2;
ll w[], ans; ll quickmul(ll a,ll b,ll mod) {
ll ite = (1LL<<)-;
return (a*(b>>)%mod*(1ll<<)%mod+a*(b&(ite))%mod)%mod;
} ll qpow(ll a, ll b, ll mod)
{
ll ret = ;
while(b)
{
if(b&) ret = quickmul(ret, a, mod);
a = quickmul(a, a, mod);
b >>= ;
}
return ret;
} bool dfs(int cur, ll now)
{
if(cur == )
{
if(now >= w[]){ans = now; return true;}
return false;
}
ll W = w[cur];
for(int i = ;i <= ;i++)
{
ll tmp = W*i + now;
if(qpow(K1, tmp, W) == (tmp%W))
{
if(dfs(cur+, tmp)) return true;
}
}
return false;
} int main()
{
int kase = ;
w[] = ;
for(int i = ;i < ;i++) w[i] = w[i-] * ;
while(scanf("%lld", &K1) == &&K1)
{
dfs(, );
printf("Case %d: Public Key = %lld Private Key = %lld\n", ++kase, K1, ans%mod);
}
}

2、不动点迭代

初始时随机选取一个超过10^12的数,如1000000000007,将其代入计算,如果f(x)!=x,那么令x=f(x),如此循环,能在短时间内找出合法解。

#include<bits/stdc++.h>
using namespace std; typedef long long ll;
const ll mod = 1e12;
ll K1, K2; ll quickmul(ll a,ll b,ll mod) {
ll ite = (1LL<<)-;
return (a*(b>>)%mod*(1ll<<)%mod+a*(b&(ite))%mod)%mod;
} ll qpow(ll a, ll b, ll mod)
{
ll ret = ;
while(b)
{
if(b&) ret = quickmul(ret, a, mod);
a = quickmul(a, a, mod);
b >>= ;
}
return ret;
} int main()
{
int kase = ;
while(scanf("%lld", &K1) == &&K1)
{
K2 = 1e11+;
while(qpow(K1, K2, mod) != K2%mod) K2 = qpow(K1, K2, mod);
printf("Case %d: Public Key = %lld Private Key = %lld\n", ++kase, K1, K2);
}
}

参考链接:

1. http://www.bubuko.com/infodetail-587732.html

2. https://blog.csdn.net/w4149/article/details/77750279

最新文章

  1. *HDU3486 RMQ+二分
  2. 如何在CentOS配置Apache的HTTPS服务
  3. Js 拖动效果
  4. [Json.net]忽略不需要的字段
  5. 关于python测试webservice接口的视频分享
  6. Java Native Interface Specification—Contents
  7. deep web
  8. 夺命雷公狗---Thinkphp----4之数据表的设计
  9. int转多进制
  10. dual,rowid,rownum
  11. NotePad++ delphi/Pascal函数过程列表插件
  12. MySQL大批量插入数据
  13. Ledongli
  14. python操作redis--string
  15. c语言_头文件_windows.h
  16. wordpress安装插件--su
  17. bootstrap快速入门笔记(三)响应式,行,列,偏移量,排序
  18. spring boot无法启动,或者正常启动之后无法访问报404的解决办法
  19. Jquery滚动到页面底部自动Ajax加载图文列表,类似图片懒加载效果,带加载效果
  20. Chipmunk僵尸物理对象的出现和解决(二)

热门文章

  1. OAuth2、OpenID、SMAL 对比
  2. App.vue 不触发 beforeRouteEnter
  3. HUE-hive常用查询语句整理
  4. 代码实现一个蛇形led走马灯
  5. Kafka学习笔记1——Kafka的安装和启动
  6. BAT: 获取时间有空格问题
  7. SqlDbx连接oracle(无需安装Oracle客户端)
  8. 使用GitHub/码云/Git个性化设置
  9. tkiner将字典用在单选上
  10. 英语pyrophane火欧珀pyrophane单词