可以发现,该数组的mi就是斐波那契数列
所以要矩阵快速幂搞出第n位
但是斐波那契数列上涨的很快,这就需要欧拉定理了
p^phi(q)%q=1(gcd(p,q)==1)
p是素数,所以可以用
然后需要5000个数的phi,q<=2^31
筛出sqrt(2^31)范围内的素数,然后直接找单个数的欧拉函数就好了

最后再套个快速幂就A了

#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
int m,n,p,q,prime[80005],tot;
bool bo[80050];
long long a[3][3],b[3][3],c[3][3];
void getprime(int N=80005){for(int i=2;i<=N;i++){if(!bo[i])prime[++tot]=i;for(int j=1;j<=tot&&i*prime[j]<=N;j++){bo[i*prime[j]]=1;if(!i%prime[j]) break;}}
}
void poww(long long A[3][3],long long B[3][3],long long C[3][3],int pp){long long D[3][3]={0};for(int j=1;j<=2;j++){for(int i=1;i<=2;i++){D[i][j]=0;for(int k=1;k<=2;k++){D[i][j]+=A[i][k]*B[k][j];D[i][j]%=pp;}}}for(int j=1;j<=2;j++)for(int i=1;i<=2;i++)C[i][j]=D[i][j];
}
int getphi(int x){int xx=x;for(int i=1;prime[i]*prime[i]<=xx;i++){if(!(xx%prime[i])){x/=prime[i];x*=(prime[i]-1);while(!(xx%prime[i]))xx/=prime[i];}}if(xx!=1){x/=xx;x*=(xx-1);}return x;
}
int main()
{scanf("%d%d",&m,&p);getprime();for(int i=1;i<=m;i++){//printf("i==%d\n",i);scanf("%d%d",&n,&q);a[1][1]=a[1][2]=a[2][1]=1; a[2][2]=0;b[1][1]=b[1][2]=1;c[1][1]=c[2][2]=1; c[1][2]=c[2][1]=0;int qq=getphi(q);//printf("q==%d  qq==%d\n",q,qq);if(n<=2){printf("%d\n",p%q);continue;}n-=2;while(n){if(n&1) poww(c,a,c,qq);poww(a,a,a,qq);n>>=1;}poww(b,c,b,qq);int mi=b[1][1]; //printf("mi==%d\n",mi);long long pp=p,ans=1;while(mi){if(mi&1) ans=(ans*pp)%q;pp=(pp*pp)%q;mi>>=1;}printf("%lld\n",ans%q);}return 0;
}

转载于:https://www.cnblogs.com/Ren-Ivan/p/7746728.html

bzoj 1409 Password 矩阵快速幂+欧拉函数相关推荐

  1. Product Oriented Recurrence(Codeforces Round #566 (Div. 2)E+矩阵快速幂+欧拉降幂)

    传送门 题目 fn=c2∗n−6fn−1fn−2fn−3\begin{aligned} &f_n=c^{2*n-6}f_{n-1}f_{n-2}f_{n-3}&\\ \end{alig ...

  2. Give Candies【快速幂+欧拉】

    Give Candies 时间限制: 1 Sec 内存限制: 128 MB 提交: 243 解决: 92 [提交] [状态] [命题人:admin] 题目描述 There are N children ...

  3. HDU 4382 【矩阵快速幂】【欧拉降幂】

     自己的思路写的 102 × 102 大小的转化矩阵,好在线代学的还行想到用矩阵分块乘法过了- 看其他人的题解用的 3 × 3  构造一个 转化矩阵 T T T ,一个用来存储结果的 P P P  先 ...

  4. YBTOJ:斐波拉契(矩阵快速幂)

    文章目录 题目描述 题目描述 代码 题目描述 题目描述 关键在于如何转化为本题的题目... 设 y=(1-根号5)/2$$ 再令: A(n)=xn +++ yn 通过尝试可以发现,A其实就是一个1,3 ...

  5. POJ 3696 欧拉函数+快速幂

    题目的意思大概就是问是否存在一串全是8的数字是L的倍数 直接想没有什么想法,要想到用简洁的形式将这个数字表示出来,对于每一位都是8的数字我们可以用 X=8*(10k-1)/9的形式表示出来,那么题目的 ...

  6. BZOJ 2326 数学作业(分段矩阵快速幂)

    实际上,对于位数相同的连续段,可以用矩阵快速幂求出最后的ans,那么题目中一共只有18个连续段. 分段矩阵快速幂即可. #include<cstdio> #include<iostr ...

  7. BZOJ.4180.字符串计数(后缀自动机 二分 矩阵快速幂/倍增Floyd)

    题目链接 先考虑 假设S确定,使构造S操作次数最小的方案应是:对T建SAM,S在SAM上匹配,如果有S的转移就转移,否则操作数++,回到根节点继续匹配S.即每次操作一定是一次极大匹配. 简单证明:假设 ...

  8. BZOJ 2004 公交线路(状压DP+矩阵快速幂)

    注意到每个路线相邻车站的距离不超过K,也就是说我们可以对连续K个车站的状态进行状压. 然后状压DP一下,用矩阵快速幂加速运算即可. #include <stdio.h> #include ...

  9. BZOJ 3240 构造矩阵+矩阵快速幂

    思路: ax+b cx+d 构造矩阵+矩阵快速幂 (需要加各种特判,,,,我好像加少了- ) //By SiriusRen #include <cstdio> #include <c ...

最新文章

  1. Qt 编写应用程序升级的配置文件json 生成工具
  2. leetcode解题记录(一)
  3. JAVA——以ReentrantLock为例学习重入锁以及公平性问题
  4. 力扣1523.在区间范围内统计奇数数目Count Odd Numbers in an Interval Range
  5. 一个tile布局的下拉框
  6. JFinal实现原理
  7. 配置隐藏计算机磁盘,这2种隐藏硬盘的方法 你绝对想不到!
  8. VS code中文版安装教程(超级详细)
  9. linux 定时器 库,linux 定时器
  10. Latex 温度单位命令
  11. 各层电子数排布规则_电子数的排布规律是什么?
  12. MATLAB算法实战应用案例精讲-【图像处理】缺陷检测(补充篇)(附matlab实现代码)
  13. Sap BussinessObjects DesignStudio-infoChart缺陷改进
  14. python找出素数_[Python 1] 如何使用Python找质数?
  15. 【SGU 448】Controlled Tournament(状态压缩动态规划)
  16. 高效算法——05列文斯登距离(Python)
  17. java 电子秤串口通信_电子秤重量读取(串口通讯)
  18. 即时通讯整体解决方案
  19. Linux下如何查看 CPU 信息, 包括位数和多核信息
  20. 郭明錤:2018年苹果将保留iPhone X镜头设计

热门文章

  1. 万字总结,知识蒸馏如何在推荐系统中大显身手?
  2. 动图|几张动图告诉你,工业机器人无所不能!
  3. 趋势 | 人工智能领域十大最具成长性技术展望
  4. 李飞飞公布谷歌云TPU、AutoML、行业方案等多项进展,AI云计算成谷歌全新增长点...
  5. 硅谷人眼中的2018年十大前沿科技预测
  6. 天才少女 12 岁被大学录取,希望 16 岁能成为 NASA 工程师
  7. 数据结构7.5_有向无环图及其应用
  8. 15.python操作mysql
  9. 计算机加电后操作系统启动过程
  10. 融合基础设施会给私有云带来什么?