bzoj 1409 Password 矩阵快速幂+欧拉函数
来源:互联网 发布:mysql外键怎么设置 编辑:程序博客网 时间:2024/06/08 08:21
可以发现,该数组的mi就是斐波那契数列
所以要矩阵快速幂搞出第n位
但是斐波那契数列上涨的很快,这就需要欧拉定理了
p^phi(q)%q=1(gcd(p,q)==1)
p是素数,所以可以用
然后需要5000个数的phi,q<=2^31
筛出sqrt(2^31)范围内的素数,然后直接找单个数的欧拉函数就好了
所以要矩阵快速幂搞出第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;}
阅读全文
0 0
- bzoj 1409 Password 矩阵快速幂+欧拉函数
- [bzoj 1409] Password 矩阵快速幂+欧拉函数
- 欧拉函数+矩阵快速幂 Password
- BZOJ 1409 快速幂+欧拉定理
- hdu5667 Sequence 【矩阵快速幂+欧拉函数降次】
- HDU 5667 Sequence【矩阵快速幂】【欧拉函数】
- hdu 5667(矩阵快速幂+欧拉函数)
- HDU 5895 矩阵快速幂+欧拉函数
- [ 欧拉定理 矩阵快速幂 ] BZOJ5118
- BZOJ 1409 Password 矩阵乘法+线性筛
- BZOJ 1409: Password 线性筛+矩阵乘法
- bzoj 1409: Password 矩阵乘法+线性筛
- 2016Shenyang网络预选赛1004 / HDU5895 (矩阵快速幂+欧拉函数降幂)
- hdu 3221 欧拉定理 +快速幂+矩阵快速幂
- HDU 2865 Birthday Toy polya 矩阵快速幂 欧拉函数
- POJ 2888 Magic Bracelet(Polya计数+dp+矩阵快速幂+欧拉函数+乘法逆元)
- hdu-5868 Different Circle Permutation 矩阵快速幂 + 欧拉函数 + polya计数定理
- HDU 5868 Different Circle Permutation(dp+polya+矩阵快速幂+欧拉函数)
- 【后台】Apache&tomcat&jboss&nignx
- 用python训练机器学习
- ubuntu操作系统下spark源码走读环境搭建
- 剑指offer 之 二叉树的镜像
- MySQL数据库入门练习200句
- bzoj 1409 Password 矩阵快速幂+欧拉函数
- CF --- 832D Misha, Grisha and Underground 【LCA + 思维】
- 图像基础7 图像分类——余弦相似度
- 二叉树面试题
- 深度学习之基础篇:凸学习问题
- Sublime 配置 Python 开发环境
- CRM的主要功能(全)
- springboot之全局异常捕获
- AtCoder 079D Decrease