题目大意:

一种数列E = {E[1],E[2],……,E[n]}

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

在此基础上他又设计了一种加密算法,该算法可以通过一个密钥q (q < p)将一个正整数n加密成另外一个正整数d,计算公式为:d = E[n] mod q

思路:

首先可以想到快速幂

然后就是求一个数的斐波那契n项次方

因为斐波那契n项很大 所以log n很大会炸

因为p^phi(q)%q=1,注意q不一定是质数

所以只需要求出 f[i]%phi(q) 然后快速幂

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<cstdlib>
 5 #include<cstring>
 6 #include<algorithm>
 7 #include<vector>
 8 #include<queue>
 9 #define inf 2139062143
10 #define ll long long
11 #define MAXN 100100
12 using namespace std;
13 inline ll read()
14 {
15     ll x=0,f=1;char ch=getchar();
16     while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
17     while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();}
18     return x*f;
19 }
20 ll p[MAXN],ntp[MAXN],cnt,n,m,mod,T,m1;
21 struct mat {ll num[2][2];};
22 mat mul(mat x,mat y)
23 {
24     mat res;
25     memset(res.num,0,sizeof(res.num));
26     for(ll i=0;i<2;i++)
27         for(ll j=0;j<2;j++)
28             for(ll k=0;k<2;k++)
29                 (res.num[i][j]+=x.num[i][k]*y.num[k][j])%=m1;
30     return res;
31 }
32 ll mat_q_pow(ll n)
33 {
34     if(n<=0) return 0;
35     mat t,res;
36     memset(res.num,0,sizeof(res.num));
37     t.num[0][0]=t.num[0][1]=t.num[1][0]=1,t.num[1][1]=0;
38     res.num[0][0]=res.num[1][1]=1;
39     while(n)
40     {
41         if(n&1) res=mul(res,t);
42         t=mul(t,t);
43         n>>=1;
44     }
45     return res.num[0][1];
46 }
47 void mem()
48 {
49     for(ll i=2;i<MAXN;i++)
50     {
51         if(!ntp[i]) p[++cnt]=i;
52         for(ll j=1;p[j]*i<MAXN;j++)
53         {
54             ntp[p[j]*i]=1;
55             if(i%p[j]==0) break;
56         }
57     }
58 }
59 void phi(ll x)
60 {
61     ll res=x;
62     for(ll i=1;p[i]*p[i]<=x;i++)
63         if(x%p[i]==0)
64         {
65             res/=p[i],res*=p[i]-1;
66             while(x%p[i]==0) x/=p[i];
67         }
68     if(x!=1) res/=x,res*=x-1;
69     m1=res;
70 }
71 ll num_q_pow(ll k,ll x)
72 {
73     ll res=1;
74     while(x)
75     {
76         if(x&1) (res*=k)%=mod;
77         (k*=k)%=mod,x>>=1;
78     }
79     return res;
80 }
81 int main()
82 {
83     T=read(),n=read();
84     mem();
85     while(T--)
86     {
87         m=read(),mod=read();
88         phi(mod);
89         printf("%lld\n",num_q_pow(n,mat_q_pow(m))%mod);
90     }
91 }

View Code

转载于:https://www.cnblogs.com/yyc-jack-0920/p/8515960.html

bzoj 1409 Password相关推荐

  1. bzoj 1409 Password 矩阵快速幂+欧拉函数

    可以发现,该数组的mi就是斐波那契数列 所以要矩阵快速幂搞出第n位 但是斐波那契数列上涨的很快,这就需要欧拉定理了 p^phi(q)%q=1(gcd(p,q)==1) p是素数,所以可以用 然后需要5 ...

  2. Android开发之第三方框架使用汇总

    1. image loading 框架: 1.1 Glide1.2 Picasso1.3 后续更新... 2.网络框架: 2.1 xUtil32.2 OkHttp32.3 Retrofit2.4 后续 ...

  3. 贝尔数C语言,bzoj 3501 PA2008 Cliquers Strike Back——贝尔数

    用贝尔三角形 p^2 地预处理 p 以内的贝尔数.可以模(mod-1)(它是每个分解下的质因子的倍数,所以不影响分开算的时候). 用公式:\( Bell[n+p^{m}]=m*Bell[n]+Bell ...

  4. You must reset your password using ALTER USER statement before executing thi

    第一次 安装好mysql 创建数据库的时候提示这个问题,百度了,自己的处理方法 就是第一次需要设置数据库的密码 ,把原始的数据库密码更改一下 更改密码的方法: mysql> SET PASSWO ...

  5. BZOJ.1558.[JSOI2009]等差数列(线段树 差分)

    BZOJ 洛谷 首先可以把原序列\(A_i\)转化成差分序列\(B_i\)去做. 这样对于区间加一个等差数列\((l,r,a_0,d)\),就可以转化为\(B_{l-1}\)+=\(a_0\),\(B ...

  6. S-T平面图中利用最短路求最小割(BZOJ 1001)

    BZOJ 1001: [BeiJing2006]狼抓兔子 最小割 题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 现在小朋友们最喜欢 ...

  7. BZOJ 1124: [POI2008]枪战Maf(构造 + 贪心)

    题意 有 \(n\) 个人,每个人手里有一把手枪.一开始所有人都选定一个人瞄准(有可能瞄准自己).然后他们按某个顺序开枪,且任意时刻只有一个人开枪. 因此,对于不同的开枪顺序,最后死的人也不同. 问最 ...

  8. BZOJ 2957楼房重建

    传送门 线段树 //Twenty #include<cstdio> #include<cstdlib> #include<iostream> #include< ...

  9. redmine忘记username和password

    环境: Ubuntu 13.10 bitnami-redmine-2.5.1-1-linux-x64-installer.run 用bitnami安装完redmine以后,有是否忘记了username ...

最新文章

  1. 系统架构设计:进程缓存和缓存服务,如何抉择?
  2. VHD(Virtual Hard Disk)的解析(上篇)——PyVinil的使用
  3. 如何系统地理解「交易平台」?
  4. 关于mbzuai的offer的三点思考
  5. 收起 展开 循环 php,CSS3 实现侧边栏展开收起动画
  6. 3.过滤数据 ---SQL
  7. JAVA实现置换加密和幻方加密(密码学)
  8. 计算机科学常见工具书清单、项目开发清单
  9. STP重新收敛过程和补充内容
  10. 王牌英雄怎么服务器维护了,王牌英雄steam版无法运行问题解决方法
  11. Hive性能调优之推测执行
  12. VB写的软件加壳都没用,超强反调试反破解分析,检测OD调试器
  13. SULLEY安装与使用
  14. 爬取2017年底最新中国全国五级行政区划代码省市区县乡镇村MySQL数据库
  15. 这是一篇1==“1”?励志:缓解压力 的文字
  16. matlab 计算物理,计算物理的MATLAB解法与可视化
  17. jar包配置开机自启
  18. 2019小明的比赛c++
  19. ECharts——条形图
  20. Maven多模块版本统一管理

热门文章

  1. c语言变长数组参数,使用gdb跟踪C语言中变长数组的实现
  2. esp8266 at接收数据中断时间_利用ESP8266获取网络同步时间(北京时间)
  3. oracle dblink 20001,解决ORA-02021: 不允许对远程数据库进行 DDL 操作下面通过DBLINK调用远程过程来执行这样的操作。...
  4. raw转bmp程序c语言,求指导,如何用c语言实现读取*.raw格式图像
  5. 集群服务器分析系统,集群服务器系统可扩展性的研究与实现
  6. Python爬虫之(三)urllib库
  7. 使用VS.NET2003操作SQLServer DTS.
  8. docker容器的使用
  9. 自定义高效支持点击监听的RecyclerView
  10. Journey源码分析二:整体启动流程