LibreOJ2045 - 「CQOI2016」密钥破解
Description
给出三个正整数\(e,N,c(\leq2^{62})\)。已知\(N\)能表示成\(p\cdot q\)的形式,其中\(p,q\)为质数。计算\(r=(p-1)(q-1),ed\equiv 1 \pmod r\),求\(c^d \bmod N\)。
Solution
其实主要就是一件事:分解大数\(N\)。这里要用到一个叫做Pollard's Rho的算法,可以在约\(O(n^{\frac{1}{4}})\)的时间复杂度上求出一个\(n\)的因数。具体原理是生日悖论,但我不知道为什么这个是悖论...伪代码如下:
nxt(x)
    return (x*x+step) mod n
PR(n)
    while true
        step=rand()
        a=b=rand()
        while true
            a=nxt(a),b=nxt(nxt(b))
            if(a==b) break
            g=gcd(abs(a-b),n)
            if(g!=1) return g
由于\(nxt(x)\)是循环的,所以用以\(a\)的两倍速度前进的\(b\)进行判断,一旦\(a=b\)则说明出现环,尝试换一个参数\(step\)去随机。
Code
//「CQOI2016」密钥破解
#include <bits/stdc++.h>
typedef long long lint;
lint n;
int pr[10]={0,2,3,5,7,11,13,17};
lint multi(lint a,lint b){lint t=a*b-(lint)((long double)a*b/n+1e-8)*n;if(t<0)return t+n;return t;}
inline lint abs(lint x) {return x<0?-x:x;}
inline lint gcd(lint x,lint y) {return y?gcd(y,x%y):x;}
int step;
inline lint nxt(lint x) {return (multi(x,x)+step)%n;}
lint PR(lint n)
{
    while(true)
    {
        step=rand();
        lint a,b; a=b=rand();
        while(true)
        {
            a=nxt(a),b=nxt(nxt(b));
            if(a==b) break;
            lint g=gcd(abs(a-b),n);
            if(g!=1) return g;
        }
    }
}
inline void exgcd(lint a,lint &x,lint b,lint &y)
{
    if(b==0) {x=1,y=0; return;}
    lint x1,y1; exgcd(b,x1,a%b,y1);
    x=y1,y=x1-a/b*y1;
}
lint inv(lint a,lint m)
{
    lint x,y; exgcd(a,x,m,y);
    while(x<0) x+=m;
    return x;
}
lint pow(lint x,lint y)
{
    lint r=1,t=x;
    for(lint i=y;i;i>>=1,t=multi(t,t)) if(i&1) r=multi(r,t);
    return r;
}
int main()
{
    lint e,c;
    scanf("%lld%lld%lld",&e,&n,&c);
    lint p=0,q=0;
    for(int i=1;i<=7;i++) {if(n%pr[i]==0) p=pr[i],q=n/p; break;}
    if(!p) p=PR(n),q=n/p;
    lint d=inv(e,(p-1)*(q-1));
    printf("%lld %lld\n",d,pow(c,d));
    return 0;
}
												
											LibreOJ2045 - 「CQOI2016」密钥破解的更多相关文章
- loj2045 「CQOI2016」密钥破解
		
CQOI 板子大赛之 pollard rho #include <iostream> #include <cstdio> using namespace std; typede ...
 - LoibreOJ 2042. 「CQOI2016」不同的最小割 最小割树 Gomory-Hu tree
		
2042. 「CQOI2016」不同的最小割 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 ...
 - loj #2044. 「CQOI2016」手机号码
		
#2044. 「CQOI2016」手机号码 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 ...
 - LibreOJ2044 - 「CQOI2016」手机号码
		
Portal Description 给出两个十一位数\(L,R\),求\([L,R]\)内所有满足以下两个条件的数的个数. 出现至少\(3\)个相邻的相同数字: 不能同时出现\(4\)和\(8\). ...
 - LibreOJ2043 - 「CQOI2016」K 远点对
		
Portal Description 给出平面上的\(n(n\leq10^5)\)个整点,求在欧几里得距离下第\(k\)远的点对之间的距离. Solution k-d树+堆. 用小根堆维护当前找到的第 ...
 - LibreOJ2042 - 「CQOI2016」不同的最小割
		
Portal Description 给出一个给出一个\(n(n\leq850)\)个点\(m(m\leq8500)\)条边的无向图.定义\(cut(s,t)\)等于\(s,t\)的最小割的容量,求在 ...
 - 「CQOI2016」不同的最小割
		
「CQOI2016」不同的最小割 传送门 建出最小割树,把每一个点对的最小割抠出来 \(\text{unique}\) 一下就好了. 参考代码: #include <algorithm> ...
 - 「CQOI2016」K 远点对
		
/* 考虑暴力 可以n ^ 2枚举点对 然后用一个容量为2k的小根堆来维护第k大 kd-tree呢就是来将这个暴力优化, 每次先找远的并且最远距离不如堆顶的话就不继续找下去 貌似挺难构造数据卡的 */ ...
 - 【LOJ】#2047. 「CQOI2016」伪光滑数
		
题解 可持久化可并堆 用\(f[i,j]\)表示最大的质数标号为i,然后有j个质数乘起来 用\(g[i,j]\)表示\(\sum_{k = 1}^{i}f[k,j]\) 转移是 \(f[i,j] = ...
 
随机推荐
- 得到本地应用程序的EXE的路径
			
实现效果: 知识运用: Application类的ExecutablePath属性 //获取启动了应用程序的可执行文件的路径和可执行文件的名称 public static string Exec ...
 - 使用ErrorProvider组件验证文本框输入
			
实现效果: 知识运用: ErrorProvider组件的BlinkStyle属性 //指示错误图标的闪烁时间 public ErrorBlinkStyle BlinkStyle{ get;set; } ...
 - ☆☆☆Dojo中define和declare的结合使用
			
在原生的js中是不可以创建类的,没有class这个关键字,但是在dojo中,dojo自定义了一个模块叫做dojo/_base/declare,用这个模块我们可以创建自己的类,实现面向对象编程. 单继承 ...
 - cocos2d-x的基本动作2
			
1.基本动作 Cocos2d提供的基本动作:瞬时动作.延时动作.运作速度. 瞬时动作:就是不需要时间,马上就完成的动作.瞬时动作的共同基类是 InstantAction. Cocos2d提供以下瞬时动 ...
 - 【数学  BSGS】bzoj2242: [SDOI2011]计算器
			
数论的板子集合…… Description 你被要求设计一个计算器完成以下三项任务: 1.给定y,z,p,计算Y^Z Mod P 的值: 2.给定y,z,p,计算满足xy≡ Z ( mod P )的最 ...
 - 【启发式搜索】Codechef March Cook-Off 2018. Maximum Tree Path
			
有点像计蒜之道里的 京东的物流路径 题目描述 给定一棵 N 个节点的树,每个节点有一个正整数权值.记节点 i 的权值为 Ai.考虑节点 u 和 v 之间的一条简单路径,记 dist(u, v) 为其长 ...
 - sphinx关键字套红
			
sphinx定义搜索结果,搜索的内容着重显示,可以使用下面代码 <?php /** * Created by PhpStorm. * User: pc00001 * Date: 2015/4/1 ...
 - java实现可安装的exe程序
			
java实现可安装的exe程序 通过编写Java代码,实现可安装的exe文件的一般思路: 1.在eclipse中创建java项目,然后编写Java代码,将编写好的Java项目导出一个.jar格式的ja ...
 - 关于PHP连接池扩展php-cp遇到的那些坑
			
php-cp是国内大神写的php第三方扩展,具体就不用多说了,细读https://github.com/swoole/php-cp,下面来说说今天安装方法. 环境:CentOS7.2.1511 由于本 ...
 - OC8051项目启动