Luogu P4358 密钥破解 题解报告
【题目大意】
给定一个正整数N,可以被分解为两个不同的质数p和q,计算出r=(p-1)*(q-1)。
然后给出了一个小于r且与r互质的整数e,已知e*d≡1(mod r),求d。
最后给定一个数c,求n=cd%N
【思路分析】
这题总体来说思路真的很简单QWQ
首先既然是找因数,那么可以立刻想到Pollard-rho(其实只是因为这是一道Pollard-Rho的模板题)
然后求d的过程就是求e的乘法逆元嘛也很简单
最后求cd,就很明显是快速幂了
于是就……over了!?
【代码实现】
放一波代码就走人吧
其实很玄学……我一开始只过了3个点,其他全部TLE,结果稍微改了一点就AC了
emmmm……好吧不是很懂,反正我已经AC了,下次不再用最开始那种做法就是了QAQ
#include<bits/stdc++.h>
#define ll long long
#define RG register
#define go(i,a,b) for(RG int i=a;i<=b;i++)
using namespace std;
ll fr(){
ll w=,q=;
char ch=getchar();
while(ch<''||ch>''){
if(ch=='-') q=-;
ch=getchar();
}
while(ch>=''&&ch<='')
w=(w<<)+(w<<)+ch-'',ch=getchar();
return w*q;
}
ll e,N,c,p,q,r;
ll gcd(ll x,ll y) {return y==?x:gcd(y,x%y);}
ll mul(ll x,ll y){//快速乘(类似于快速幂的东东)
if(y==||x==) return ;
ll ans=;
while(y){
if(y&) ans+=x,ans%=N;
x=(x<<)%N;y>>=;
}
return ans;
}
ll count(ll x,ll y) {return (mul(x,x)+y)%N;}
void Pollard_Rho(){
ll cc=rand()%N+;
ll x1,x2,d;
x1=x2=rand()%N+;
while(){
x1=count(x1,cc);x2=count(count(x2,cc),cc);
if(x1==x2) {x1=x2=rand()%N+;cc=rand()%N+;}
d=gcd(abs(x2-x1),N);
if(d>&&d<N){p=d;q=N/p;return;}
}
return;
}
ll exgcd(ll a,ll b,ll &x,ll &y){//求乘法逆元
if(b==) {x=;y=;return a;}
ll d=exgcd(b,a%b,x,y);
ll z=x;x=y;y=z-y*(a/b);
return d;
}
ll ksm(ll x,ll y){
ll ans=,num=x;
while(y){
if(y&) ans=mul(ans,num)%N;
num=mul(num,num)%N;
y>>=;
}
return ans;
}
int main(){
srand(time());//这个是取随机数之前一定要写的东东QAQ
e=fr();N=fr();c=fr();
Pollard_Rho();
r=mul(p-,q-);
ll d,D;exgcd(e,r,d,D);
while(d<=) d+=r;
ll n=ksm(c,d);
cout<<d<<" "<<n<<endl;
return ;
}
点击看玄学代码
Luogu P4358 密钥破解 题解报告的更多相关文章
- 【Luogu】P4358密钥破解(Pollard Rho)
题目链接 容易发现如果我们求出p和q这题就差不多快变成一个sb题了. 于是我们就用Pollard Rho算法进行大数分解. 至于这个算法的原理,emmm 其实也不是很清楚啦 #include<c ...
- 洛谷P4358密钥破解 [CQOI2016] 数论
正解:数论 解题报告: 先,放个传送门QwQ 这题难点可能在理解题意,,, 所以我先放个题意QAQ 大概就是说,给定一个整数N,可以被拆成两个质数的成绩p*q,然后给出了一个数e,求d满足e*d=1( ...
- Luogu P4204 神奇口袋 题解报告
题目传送门 [题目大意] 一个口袋里装了t种颜色的球,第i种颜色的球的数目为a[i],每次随机抽一个小球,然后再放d个这种颜色的小球进口袋. 给出n个要求,第x个抽出的球颜色为y,求满足条件的概率. ...
- LG4718 【模板】Pollard-Rho算法 和 [Cqoi2016]密钥破解
Pollard-Rho算法 总结了各种卡常技巧的代码: #define int long long typedef __int128 LL; IN int fpow(int a,int b,int m ...
- 【BZOJ-4522】密钥破解 数论 + 模拟 ( Pollard_Rho分解 + Exgcd求逆元 + 快速幂 + 快速乘)
4522: [Cqoi2016]密钥破解 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 290 Solved: 148[Submit][Status ...
- Visio Premium 2010密钥+破解激活方法
Visio Premium 2010密钥+破解激活方法: 在安装时能够使用下面密钥: GR24B-GC2XY-KRXRG-2TRJJ-4X7DC VWQ6G-37WBG-J7DJP-CY66Y-V27 ...
- 2015浙江财经大学ACM有奖周赛(一) 题解报告
2015浙江财经大学ACM有奖周赛(一) 题解报告 命题:丽丽&&黑鸡 这是命题者原话. 题目涉及的知识面比较广泛,有深度优先搜索.广度优先搜索.数学题.几何题.贪心算法.枚举.二进制 ...
- 2017-2018-1 20155312《信息安全技术》实验二——Windows口令破解实验报告
2017-2018-1 20155312<信息安全技术>实验二--Windows口令破解实验报告 实验目的 了解Windows口令破解原理 对信息安全有直观感性认识 能够运用工具实现口令破 ...
- cojs 强连通图计数1-2 题解报告
OwO 题目含义都是一样的,只是数据范围扩大了 对于n<=7的问题,我们直接暴力搜索就可以了 对于n<=1000的问题,我们不难联想到<主旋律>这一道题 没错,只需要把方程改一 ...
随机推荐
- java学习札记
java学习札记 0x0 学习原因 本来打算大三再去跟着课程去学习java的,但是现在题目越来越偏向java,所以迫于无奈开启了java的学习篇章,同时也正好写个笔记总结下自己学习一门语言的流程. ...
- Springboot + Atomikos + Druid + Mysql 实现JTA分布式事务
DataSource 配置 package com.cheng.dynamic.config; import java.util.Properties; import javax.sql.DataSo ...
- 破解idea地址
https://blog.csdn.net/animatecat/article/details/81483174
- python + django + echart 构建中型项目
1. python生产环境, 多层modules 导入问题: 多个modules 如何导入不同级别的包: 在每个modules下新建 __init__.pyimport os, sys dir_myt ...
- MVC中使用Hangfire按秒执行任务
更新Hangfire版本到1.7.0,才支持使用按秒循环任务执行 RecurringJob.AddOrUpdate("test",()=>writeLog("每20 ...
- 抽奖大转盘 js代码
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- cesium-navigation 使用(非require,es6引用)
cesium-navigation-es6(非require,es6引用) 为什么你建立cesium-navigation插件? 插件形式不影响之前项目使用,es6 使用 首先,所有的Cesiumjs ...
- leanote使用本地账户+坚果云同步
1. 换机器后笔记无法显示 这是因为新建账户与原账户userid不一致. 正确的同步方式为: 下载leanote并解压,不运行,不新建账户 从坚果云同步leanote数据 创建leanote的数据目录 ...
- HF-01
胡凡 本书在第2章对C语言的语法进行了详细的入门讲解,并在其中融入了部分C+的特性. 第3-5章是 入门部分. 第3章 初步训练读者最基本的编写代码能力: 第4章对 常用介绍,内容重要: 第5章是 ...
- dgraph解决社交关系中的正反向查找
dgraph解决社交关系中的正反向查找 本篇介绍的是, 社交关系中的关注者与被关注者在dgraph中如何实现查找. 对dgraph的基本操作不太清楚的可以看看我之前写的博客 dgraph实现基本操作 ...