博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
uoj74 【UR #6】破解密码
阅读量:5146 次
发布时间:2019-06-13

本文共 1276 字,大约阅读时间需要 4 分钟。

发现这个题的本质就是在做\(\rm hash\)

我们显然能够列出\(n\)个方程,之后高消,这是\(O(n^3)\)

但是观察一下第一个和第二个方程

\[a_{1}26^{n-1}+a_{2}26^{n-2}+...+a_{n}26^{0}=b_1\]

\[a_{2}26^{n-1}+a_{3}26^{n-2}+...+a_{1}26^{0}=b_2\]

考虑让他们强行对齐一下,于是上面的方程乘\(26\)

\[a_{1}26^{n}+a_{2}26^{n-1}+...+a_{n}26^{1}=26b_1\]

相互减一下,中间那些对齐的项就消没了

\[a_126^0-a_126^{n}=b_2-26b_1\]

\(a_1=\frac{b_2-26b_1}{1-26^n}\),我们这样就能解出整个\(a\)

之后发现在\(26^n\equiv 1(\rm mod\ p)\)的时候就崩了

我们发现如果\(b_1-a_1\times 26^n\equiv \frac{b_2-a_1}{26}(\rm mod\ p)\),即\(26b_i-(1-26^n)a_1=b_{i+1}\)

因为\(26^n\equiv 1(\rm mod\ p)\),所以这个时候\(26b_i\equiv b_{i+1}(\rm mod \ p)\),又因为数据保证有解,所以我们只需要构造一个\(a\),使得其满足\(a_{1}26^{n-1}+a_{2}26^{n-2}+...+a_{n}26^{0}=b_1\)即可,这样后面的自然也会满足

所以我们将\(b_1\)转成一个\(n\)位的\(26\)进制数即可

代码

#include
#define re registerinline int read() { char c=getchar();int x=0;while(c<'0'||c>'9') c=getchar(); while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();return x;}const int maxn=1e5+5;int n,p,mod;int pw[maxn],a[maxn],s[maxn];inline int ksm(int a,int b) { if(a<0) a+=mod; int S=1; for(;b;b>>=1,a=1ll*a*a%mod) if(b&1) S=1ll*S*a%mod; return S;}namespace sub { inline void solve() { int x=a[0]; for(re int i=n-1;i>=0;--i) s[i]=x%26,x/=26; for(re int i=0;i

转载于:https://www.cnblogs.com/asuldb/p/11485997.html

你可能感兴趣的文章
好玩的-记最近玩的几个经典ipad ios游戏
查看>>
tmux的简单快捷键
查看>>
Vue_(组件通讯)子组件向父组件传值
查看>>
[Serializable]的应用--注册码的生成,加密和验证
查看>>
Android 官方新手指导教程
查看>>
安装 Express
查看>>
Weka中数据挖掘与机器学习系列之基本概念(三)
查看>>
leetcode-Sort List
查看>>
中文词频统计
查看>>
Postman-----如何导入和导出
查看>>
【Linux】ping命令详解
查看>>
Oracle中包的创建
查看>>
关于PHP会话:session和cookie
查看>>
jQuery on(),live(),trigger()
查看>>
treegrid.bootstrap使用说明
查看>>
[Docker]Docker拉取,上传镜像到Harbor仓库
查看>>
导航,头部,CSS基础
查看>>
[USACO 2017 Feb Gold] Tutorial
查看>>
gzip
查看>>
转负二进制(个人模版)
查看>>