[bzoj 1409] Password 矩阵快速幂+欧拉函数
考试的时候想到了矩阵快速幂+快速幂,但是忘(bu)了(hui)欧拉定理。
然后gg了35分。
题目显而易见,让求一个数的幂,幂是斐波那契数列里的一项,考虑到斐波那契也很大,所以我们就需要欧拉定理了
p是素数,所以可以搞
然后我们用矩阵快速幂求出幂,然后快速幂即可解决问题
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> using namespace std; #define pos(i,a,b) for(int i=(a);i<=(b);i++) #define Ma 50000 #define LL long long LL prime[Ma],num_prime; LL isnotprime[Ma]={1,1}; LL c,ou; LL m,p,n,q; struct matrix{ LL a[10][10]; matrix(){ memset(a,0,sizeof(a)); } }; matrix mul(matrix aa,matrix b){ matrix c; pos(i,0,1){ pos(j,0,1){ c.a[i][j]=0; pos(k,0,1){ c.a[i][j]=(c.a[i][j]+aa.a[i][k]*b.a[k][j])%ou; } } } return c; } void getprime(){ pos(i,2,Ma-1){ if(!isnotprime[i]){ prime[num_prime++]=i; } for(int j=0;j<num_prime&&i*prime[j]<Ma;j++){ isnotprime[i*prime[j]]=1; if(!(i%prime[j])){ c++; break; } } } } matrix init(){ matrix res; pos(i,0,1){ pos(j,0,1) res.a[i][j]=(i==j); } return res; } matrix ks(matrix aa,int k){ matrix res=init(); while(k){ if(k&1) res=mul(res,aa); k>>=1; aa=mul(aa,aa); } return res; } LL oula(LL nn){ LL mm=(int)sqrt(nn+0.5); LL an=nn; for(int i=0;prime[i]<=mm;i++){ if(nn%prime[i]==0){ an=an/prime[i]*(prime[i]-1); while(nn%prime[i]==0) nn/=prime[i]; } } if(nn>1) an=an/nn*(nn-1); return an; } LL qpow(LL a,LL k,LL c){ LL an=1; a=a%c; while(k){ if(k&1){ an=(an*a)%c; } k>>=1; a=(a*a)%c; } return an; } LL ans; int main(){ getprime(); scanf("%lld%lld",&m,&p); while(m--){ ans=0; scanf("%lld%lld",&n,&q); ou=oula(q); matrix A; A.a[0][0]=1; A.a[0][1]=1; A.a[1][0]=1; A.a[1][1]=0; matrix res=ks(A,n-1); LL tmp=res.a[0][0]; //cout<<"ou="<<ou<<" tmp="<<tmp<<endl; ans=qpow(p,tmp,q)%q; printf("%lld\n",ans); } return 0; }
[bzoj 1409] Password 矩阵快速幂+欧拉函数的更多相关文章
- HDU4549 M斐波那契数列 矩阵快速幂+欧拉函数+欧拉定理
M斐波那契数列 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Sub ...
- HDU 3221 矩阵快速幂+欧拉函数+降幂公式降幂
装载自:http://www.cnblogs.com/183zyz/archive/2012/05/11/2495401.html 题目让求一个函数调用了多少次.公式比较好推.f[n] = f[n-1 ...
- hdu 5895(矩阵快速幂+欧拉函数)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5895 f(n)=f(n-2)+2*f(n-1) f(n)*f(n-1)=f(n-2)*f(n-1)+2 ...
- HDU 4549 矩阵快速幂+快速幂+欧拉函数
M斐波那契数列 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Sub ...
- Product Oriented Recurrence(Codeforces Round #566 (Div. 2)E+矩阵快速幂+欧拉降幂)
传送门 题目 \[ \begin{aligned} &f_n=c^{2*n-6}f_{n-1}f_{n-2}f_{n-3}&\\ \end{aligned} \] 思路 我们通过迭代发 ...
- hdu4549 矩阵快速幂 + 欧拉降幂
R - M斐波那契数列 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit ...
- Super A^B mod C (快速幂+欧拉函数+欧拉定理)
题目链接:http://acm.fzu.edu.cn/problem.php?pid=1759 题目:Problem Description Given A,B,C, You should quick ...
- hdu 2814 快速求欧拉函数
/** 大意: 求[a,b] 之间 phi(a) + phi(a+1)...+ phi(b): 思路: 快速求欧拉函数 **/ #include <iostream> #include & ...
- BZOJ 1297 迷路(矩阵快速幂)
很容易想到记忆化搜索的算法. 令dp[n][T]为到达n点时时间为T的路径条数.则dp[n][T]=sigma(dp[i][T-G[i][n]]); 但是空间复杂度为O(n*T),时间复杂度O(n*n ...
随机推荐
- Linux中FTP服务器的搭建
vmware12上安装的CentOs6.8,最终实现物理机上的windows10能正常访问CentOs上的FTP服务器. 一.查看是否安装有ftp相关的安装包. # rpm -qa | grep vs ...
- [leetcode-617-Merge Two Binary Trees]
Given two binary trees and imagine that when you put one of them to cover the other, some nodes of t ...
- [leetcode-572-Subtree of Another Tree]
Given two non-empty binary trees s and t, check whether tree t hasexactly the same structure and nod ...
- example001点击隐藏
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Hugo快速搭建Blog
以往我们搭建blog要么学习一个编程语言+Web开发框架,要么使用现成的blog系统(如WordPress).其实我们还可以使用Hugo.Hugo是由Go语言实现的静态网站生成器,它不需要数据库,所以 ...
- JavaScript学习笔记(一)——初识js
这个周,开始了JavaScript的学习路程.虽然从高中开始就接触了网页设计的知识,大学里的学习也算回顾了Html和Css的知识,实习期间在牛盾科技也是做的网站建设,不过通过前段时间找工作才发现自己了 ...
- Swift实现JSON转Model - HandyJSON使用讲解
背景: 很多时候,我们从服务端请求下的数据都是Json格式,我们需要拿这些数据显示到我们的UI界面. 因此,我们的做法基本都会先将json转为方便使用的数据模型,或者也可以直接转字典解决. 在OC中, ...
- Java基础语法<二> 字符串String
1. 代码点与代码单元 Java字符串由char序列组成.大多数的常用Unicode字符使用一个代码单元就可以表示,而辅助字符需要一对代码单元表示. length()方法将返回采用UTF-16编码表示 ...
- 代码托管SVN到Git迁移(使用小乌龟工具)
1.环境信息 Git Server 华为软件开发云 代码托管 SVN Server 本地SVN服务器 Windows Server2012 R2 本地主机 Win ...
- 实现一个栈类,类似STL中的栈
1.思路讲解 stack集合类是一个简单的堆栈的实现. 这里有两个模板参数,T和size,T用于指定堆栈中的元素类型,my_size用于表示堆栈中项数的最大值. 类中添加方法isempty.isful ...