Description

Rivest是密码学专家。近日他正在研究一种数列E = {E[1],E[2],……,E[n]},

且E[1] = E[2] = p(p为一个质数),E[i] = E[i-2]*E[i-1] (若2<i<=n)。

例如{2,2,4,8,32,256,8192,……}就是p = 2的数列。在此基础上他又设计了一种加密算法,该算法可以通过一个密钥q (q < p)将一个正整数n加密成另外一个正整数d,计算公式为:d = E[n] mod q。现在Rivest想对一组数据进行加密,但他对程序设计不太感兴趣,请你帮助他设计一个数据加密程序。

Input

第一行读入m,p。其中m表示数据个数,p用来生成数列E。 以下有m行,每行有2个整数n,q。n为待加密数据,q为密钥。 数据范围: 0 < p n< 2^31 0 < q < p 0 < m <= 5000。

Output

将加密后的数据按顺序输出到文件 第i行输出第i个加密后的数据。 输入样例1 2 7 4 5 4 6 输入样例2 4 7 2 4 7 1 6 5 9 3

Sample Input

输入样例1

2 7

4 5

4 6

输入样例2

4 7

2 4

7 1

6 5

9 3

Sample Output

输出样例1

3

1

输出样例2

3

0

1

1

时空限制

1s,64MB

【题解】

      我心中的题目难度排名:数学>玄学>信息学……千古难题数学题,考试的时候刚开始连式子都没推,直接暴力递推骗来49分。后来一直在打大模拟,最后临交卷回来看一眼好像是斐波那契,起码应该拿矩阵快速幂和普通快速幂搞一搞,但是没有时间了就没有打。

欧拉定理,我的理解就是用来降幂,不过这道题好像模了phi[c]之后并没有加phi[c],此等天机本蒟蒻不明觉厉。这个式子推一推就发现p的指数是斐波那契数列,但是斐波那契数列增长很快,所以只能用欧拉定理降幂。具体做法是预处理或直接求q的欧拉函数,把它作为求斐波那契数列的矩阵快速幂里的模数,然后得到降幂后的指数再普通快速幂求p的幂。

结合快速幂和欧拉定理,这道题大概并不太难。但是在考场上一是没有仔细想,二来也根本没有降幂的意识。数论就像英语音标一样,学了一遍又一遍,还是忘的多会的少。改题的过程更痛苦,几乎是重学欧拉函数(欧拉定理我学过吗?),原来学的数论只为了做那么两三道题,过后连点定义都说不明白。提高数学水平,是迫在眉睫的问题了。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#define ll long long
using namespace std;
const int sj=;
int m;
ll n,p,q,temp,k,phi[sj],s[sj],ge;
bool v[sj];
void prime(ll x)
{
for(ll i=;i<x;i++)
{
if(!v[i])
{
s[ge++]=i;
phi[i]=i-;
}
for(ll j=;j<ge&&i*s[j]<x;j++)
{
ll mb=i*s[j];
v[mb]=;
if(i%s[j]==)
{
phi[mb]=phi[i]*s[j];
break;
}
else phi[mb]=phi[i]*(s[j]-);
}
}
phi[]=;
}
ll fb(ll x,ll y)
{
ll a[][]={},ans[][]={},f[][]={};
a[][]=a[][]=a[][]=ans[][]=ans[][]=;
while(x)
{
if(x&)
{
memset(f,,sizeof(f));
for(int i=;i<;i++)
for(int j=;j<;j++)
for(int l=;l<;l++)
f[i][j]+=ans[i][l]*a[l][j]%y;
memcpy(ans,f,sizeof(f));
}
x>>=;
memset(f,,sizeof(f));
for(int i=;i<;i++)
for(int j=;j<;j++)
for(int l=;l<;l++)
f[i][j]+=a[i][l]*a[l][j]%y;
memcpy(f,a,sizeof(a));
}
memset(f,,sizeof(f));
memset(a,,sizeof(a));
f[][]=;
f[][]=;
for(int i=;i<;i++)
for(int j=;j<;j++)
for(int l=;l<;l++)
a[i][j]+=f[i][l]*ans[l][j]%y;
return a[][]%y;
}
ll ph(ll x)
{
if(x<sj) return phi[x];
ll temp=x;
for(ll i=;i*i<=x;i++)
if(x%i==)
{
temp=temp-temp/i;
while(x%i==)
x/=i;
}
if(x>)
temp=temp-temp/x;
return temp;
}
ll ksm(ll x,ll y,ll z)
{
x%=z;
ll jg=;
while(y)
{
if(y&) jg=jg*x%z;
x=x*x%z;
y>>=;
}
return jg%z;
}
int main()
{
prime(sj-);
scanf("%d%lld",&m,&p);
for(int i=;i<=m;i++)
{
scanf("%lld%lld",&n,&q);
printf("%lld\n",ksm(p,fb((n-),ph(q)),q));
}
return ;
}

password

Password的更多相关文章

  1. 打开程序总是会提示“Enter password to unlock your login keyring” ,如何成功关掉?

    p { margin-bottom: 0.1in; line-height: 120% } 一.一开始我是按照网友所说的 : rm -f ~/.gnome2/keyrings/login.keyrin ...

  2. your password has expired.to log in you must change it

    今天应用挂了,log提示密码过期.客户端连接不上. 打开mysql,执行sql语句提示密码过期 执行set password=new password('123456'); 提示成功,但客户端仍然连接 ...

  3. MySql Access denied for user 'root'@'localhost' (using password:YES) 解决方案

    关于昨天下午说的MySQL服务无法启动的问题,解决之后没有进入数据库,就直接关闭了电脑. 今早打开电脑,开始-运行 输入"mysql -uroot -pmyadmin"后出现以下错 ...

  4. [上架] iOS "app-specific password" 上架问题

    当你的 Apple ID 改用双重认证密码时,上架 iOS App 需要去建立一个专用密码来登入 Apple ID 才能上架. 如果使用 Application Loader 上传时,得到这个讯息: ...

  5. [LeetCode] Strong Password Checker 密码强度检查器

    A password is considered strong if below conditions are all met: It has at least 6 characters and at ...

  6. mysql 错误 ERROR 1372 (HY000): Password hash should be a 41-digit hexadecimal number 解决办法

    MySQL创建用户(包括密码)时,会提示ERROR 1372 (HY000): Password hash should be a 41-digit hexadecimal number: 问题原因: ...

  7. phpmyadmin #1045 - Access denied for user 'root'@'localhost' (using password: NO)

    phpmyadmin访问遇到1045问题 #1045 - Access denied for user 'root'@'localhost' (using password: NO) 解决办法 找到p ...

  8. 保留password模式文本框textbox内的数据不丢失。

    在asp.net 2.0环境下,使用textbox,提交到服务器再传回,如果textbox是password模式的,那么textbox内的密码(星号),就没有了! protected override ...

  9. Windows mysql提示:1045 access denied for user 'root'@'localhost' using password yes

    Windows mysql提示:1045 access denied for user 'root'@'localhost' using password yes http://blog.csdn.n ...

  10. ERROR 1819 (HY000): Your password does not satisfy the current policy requirements

    为了加强安全性,MySQL5.7为root用户随机生成了一个密码,在error log中,关于error log的位置,如果安装的是RPM包,则默认是/var/log/mysqld.log. 一般可通 ...

随机推荐

  1. kali系统破解WPA密码实战

    上次发布过一篇在OSX系统破解WIFI密码的教程, 这次发布一篇使用kali破解wifi的教程 WEP和WPA/PSK的区别 WPA/PSK的加密方式相对于WEP的加密方式更加安全,WEP是一种老式的 ...

  2. 【开源】做了一个WinForm窗体的投影组件,能够为窗口添加影子效果

    最近手头上的项目终于忙得差不多了,想起好久没有更新了的NanUI,再看着每天QQ群未读消息闪烁的标志,突然才发现似乎愧对了群里各位喜爱NanUI的朋友们.于是乎,就想趁这几天有时间,好好的修复一下Na ...

  3. CSS Why

    前面的话 在CSS学习目录中,已经详细地介绍了CSS如何使用.知其然,还要知其所以然.本文将介绍CSS各部分出现的原因,仅限个人理解,如有不妥,欢迎交流 Why CSS 早期的大多数网站标记几乎完全由 ...

  4. .NET Core 2.0 Preview2 发布汇总

    前言 关于 ASP.NET Core 2.0 的新功能可以查看我的这篇博客. 这篇文章是 Priview2中的一些改进. .NET Core 2.0 - Preview2 Azure 的改进 Dock ...

  5. thinkphp之获取客户端IP地址

    /** * 获取客户端IP地址 * @param integer $type 返回类型 0 返回IP地址 1 返回IPV4地址数字 * @return mixed */ function get_cl ...

  6. 【Android Developers Training】 108. 使用模拟定位进行测试

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  7. flask 上传头像

    上传头像,自己感觉了好久,就是上传文件呗其实,存在一个路径,数据库存储这个路径,然后展示给前端,啥都不说,看怎么实现的. 数据库设置如下 user_image=db.Column(db.String( ...

  8. 微信小程序知识总结及案例集锦

    微信小程序知识总结及案例集锦 微信小程序的发展会和微信公众号一样,在某个时间点爆发 学习路径 微信小程序最好的教程肯定是官方的文档啦,点击这里直达 微信官方文档 认真跟着文档看一遍,相信有vue前端经 ...

  9. Angular基础(一)

    AngularJS有五个主要核心特性,如下介绍: 双向数据绑定 -- 实现了把model与view完全绑定在一起,model变化,view也变化,反之亦然. 模板 -- 在AngularJS中,模板相 ...

  10. vijos1034题解

    题目: 若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系. 规定:x和y是亲戚,y和z是亲戚,那么x和z也是亲戚.如果x,y是亲 ...