bzoj 1409 Password 矩阵快速幂+欧拉函数
所以要矩阵快速幂搞出第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 矩阵快速幂+欧拉函数相关推荐
- 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 ...
- Give Candies【快速幂+欧拉】
Give Candies 时间限制: 1 Sec 内存限制: 128 MB 提交: 243 解决: 92 [提交] [状态] [命题人:admin] 题目描述 There are N children ...
- HDU 4382 【矩阵快速幂】【欧拉降幂】
自己的思路写的 102 × 102 大小的转化矩阵,好在线代学的还行想到用矩阵分块乘法过了- 看其他人的题解用的 3 × 3 构造一个 转化矩阵 T T T ,一个用来存储结果的 P P P 先 ...
- YBTOJ:斐波拉契(矩阵快速幂)
文章目录 题目描述 题目描述 代码 题目描述 题目描述 关键在于如何转化为本题的题目... 设 y=(1-根号5)/2$$ 再令: A(n)=xn +++ yn 通过尝试可以发现,A其实就是一个1,3 ...
- POJ 3696 欧拉函数+快速幂
题目的意思大概就是问是否存在一串全是8的数字是L的倍数 直接想没有什么想法,要想到用简洁的形式将这个数字表示出来,对于每一位都是8的数字我们可以用 X=8*(10k-1)/9的形式表示出来,那么题目的 ...
- BZOJ 2326 数学作业(分段矩阵快速幂)
实际上,对于位数相同的连续段,可以用矩阵快速幂求出最后的ans,那么题目中一共只有18个连续段. 分段矩阵快速幂即可. #include<cstdio> #include<iostr ...
- BZOJ.4180.字符串计数(后缀自动机 二分 矩阵快速幂/倍增Floyd)
题目链接 先考虑 假设S确定,使构造S操作次数最小的方案应是:对T建SAM,S在SAM上匹配,如果有S的转移就转移,否则操作数++,回到根节点继续匹配S.即每次操作一定是一次极大匹配. 简单证明:假设 ...
- BZOJ 2004 公交线路(状压DP+矩阵快速幂)
注意到每个路线相邻车站的距离不超过K,也就是说我们可以对连续K个车站的状态进行状压. 然后状压DP一下,用矩阵快速幂加速运算即可. #include <stdio.h> #include ...
- BZOJ 3240 构造矩阵+矩阵快速幂
思路: ax+b cx+d 构造矩阵+矩阵快速幂 (需要加各种特判,,,,我好像加少了- ) //By SiriusRen #include <cstdio> #include <c ...
最新文章
- Qt 编写应用程序升级的配置文件json 生成工具
- leetcode解题记录(一)
- JAVA——以ReentrantLock为例学习重入锁以及公平性问题
- 力扣1523.在区间范围内统计奇数数目Count Odd Numbers in an Interval Range
- 一个tile布局的下拉框
- JFinal实现原理
- 配置隐藏计算机磁盘,这2种隐藏硬盘的方法 你绝对想不到!
- VS code中文版安装教程(超级详细)
- linux 定时器 库,linux 定时器
- Latex 温度单位命令
- 各层电子数排布规则_电子数的排布规律是什么?
- MATLAB算法实战应用案例精讲-【图像处理】缺陷检测(补充篇)(附matlab实现代码)
- Sap BussinessObjects DesignStudio-infoChart缺陷改进
- python找出素数_[Python 1] 如何使用Python找质数?
- 【SGU 448】Controlled Tournament(状态压缩动态规划)
- 高效算法——05列文斯登距离(Python)
- java 电子秤串口通信_电子秤重量读取(串口通讯)
- 即时通讯整体解决方案
- Linux下如何查看 CPU 信息, 包括位数和多核信息
- 郭明錤:2018年苹果将保留iPhone X镜头设计