题意

输入正整数 $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

LA 4998简单加密游戏 —— 自相似性质&&不动点迭代的更多相关文章

  1. 用C语言简单加密解密

    使用char表示的字符型数据,在本质上与我们前面介绍的整型数据并无太大的区别,只是char类型占用的内存字节数更小,能够表示的数据范围更小而已.在使用上,char被专门用来表示C语言的字符集中的各种字 ...

  2. Android简单加密保护自有图片资源

    现在大部分android应用的图片资源,被反编译后就可以直接拿来用,如果不想让自己的图片资源直接被反编译后使用,首先想到的应该是把图片加密.这里笔者抛砖引玉,草草写了一个对图片进行简单加密的方法,希望 ...

  3. 信息安全系统设计基础课程实践:简单TUI游戏设计

    简单TUI游戏设计                目       录               一                      Curses库简介与基本开发方法             ...

  4. 一款简单射击游戏IOS源码

    源码描述: 一款基于cocos2d的简单设计游戏,并且也是一款基于cocos2d的简单射击游戏(含苹果IAD广告), 游戏操作很简单,哪个数字大就点击射击哪个.里面有苹果iad广告,功能简单完整,适合 ...

  5. 怎样用HTML5 Canvas制作一个简单的游戏

    原文连接: How To Make A Simple HTML5 Canvas Game 自从我制作了一些HTML5游戏(例如Crypt Run)后,我收到了很多建议,要求我写一篇关于怎样利用HTML ...

  6. Cocos2d-x-Lua 开发一个简单的游戏(记数字步进白色块状)

    Cocos2d-x-Lua 开发一个简单的游戏(记数字步进白色块状) 本篇博客来给大家介绍怎样使用Lua这门语言来开发一个简单的小游戏-记数字踩白块. 游戏的流程是这种:在界面上生成5个数1~5字并显 ...

  7. [android游戏开发初学]简单的游戏框架

    这两天,没事想学习游戏开发,看了一些资料之后准备开始.为了将来编码方便,先写了一个简单的游戏框架方便自己以后做练习用. 如果以后没有什么特殊的需求--比如opengl什么的,会尽量用这个简单框架来实现 ...

  8. 简单Elixir游戏服务器开篇

    以前的Elixir游戏服设计系列种种原因没有完成. 后来虽然用Elixir + riak 完成了一个麻将的初始版本,可惜公司也挂了. 现在到新公司,比较空闲,想着像完成一个心愿一样,还是重启下吧(希望 ...

  9. 5、使用Libgdx设计一个简单的游戏------雨滴

    (原文:http://www.libgdx.cn/topic/49/5-%E4%BD%BF%E7%94%A8libgdx%E8%AE%BE%E8%AE%A1%E4%B8%80%E4%B8%AA%E7% ...

随机推荐

  1. fiddler抓包-4-简单对数据进行mock

    前言 Fiddler中有一个 AutoRespinder 选项,我们可以用它作为mock数据,可以修改它的参数等等.所有信息的返回,与我们断点类似,但这里也可以mock状态码直接是404或者跳转至另一 ...

  2. 运行带参数的python脚本

    问题描述: 要执行python脚本,有哪几种方法. 特别是看书的时候,书上只讲解了如何在linux下运行,windows根本就没有那些命令,该怎么办呢? 方法1:python自带的IDLE编辑器 Ru ...

  3. python多条插入问题

    多条插入用excutemany(listtuple) #coding=utf-8 import MySQLdb import traceback sqlstr= "insert into t ...

  4. 父组件调用子组件 viewChild

    父组件调用子组件 1.在子组件的ts中声明一个变量 public  lineout:any="你好,我是被父组件调用的子组件";  2.在父组件的html中写入 (引入子组件) & ...

  5. Laravel自定义排序

    如果数据库的status字段有0,1,2,3几种状态,如果想让status为1,2的状态排在最前面 那么可以这样: $obj = $obj->orderByRaw(DB::raw('FIELD( ...

  6. ForkJoin和流式操作

    Fork/Join框架:在必要的情况下,将一个大任务,进行拆分(fork) 成若干个子任务(拆到不能再拆,这里就是指我们制定的拆分的临界值),再将一个个小任务的结果进行join汇总. 采用juc包的f ...

  7. Java 8创建Stream流的5种方法

    不知不觉间,Java已经发展到13了,来不及感慨时间过得真的太快了,来不及学习日新月异的技术更新,目前大多数公司还是使用的JDK8版本,一方面是版本的稳定,另一方面是熟悉,所以很多公司都觉得不升级也挺 ...

  8. Kafka学习笔记1——Kafka的安装和启动

    一.准备工作 1. 安装JDK 可以用命令 java -version 查看版本

  9. ifame内嵌页面全屏完美展示

    <body style= marginwidth= marginheight= width='100%' height='100%' allowfullscreen='true' src='ht ...

  10. C#工作常用关键字

    1.throw //抛出throw new Exception("获取数据失败") //抛出异常 2.Ticks //long类型的数,表示时间,一个以0.1纳秒为单位的时间戳,/ ...