欧拉定理+质因子分解+矩阵快速幂——cf1182E
好题!
/*
gi=c^i * fi
gi=gi-1 * gi-2 * gi-3
把g1,g2,g3质因数分解
g1=p1^e11 * p2^e12 * p3^e13 ... pk^e1k
g2=p1^e21 * p2^e22 * p3^e23 ... pk^e2k
g3=p1^e31 * p2^e32 * p3^e33 ... pk^e3k
然后构造初始矩阵
e11 e12 e13 ... e1k
e21 e22 e23 ... e2k
e31 e32 e33 ... e3k
这个3*m矩阵前面乘以系数矩阵3*3
0 1 0
1 0 0
1 1 1
矩阵快速幂得到最后矩阵
en1 en2 en3 ... enk
...
... 即每个质因子最后的指数
然后计算出gn=c^n * fn
fn = gn*inv(c^n) 注意!!! a^x = a^(x % phi(p)) (mod p)
所以矩阵里乘法的模数时mod-1 !
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define maxn 2000005
#define mod 1000000007
ll n,c,f1,f2,f3,A[][],M[][]; set<ll>s;
ll p[],E[][],k;
void divide(ll x){
ll tmp=x;
for(ll i=;i*i<=tmp;i++)
if(tmp%i==){
s.insert(i);
while(tmp%i==)tmp/=i;
}
if(tmp>)s.insert(tmp);
}
void calc(ll x,int id){
for(ll i=;i<=k;i++)
while(x%p[i]==)
E[id][i]++,x/=p[i];
} void mul1(ll A[][],ll B[][]){
ll res[][]={};
for(int i=;i<=;i++)
for(int j=;j<=;j++)
for(int k=;k<=;k++)
res[i][j]=(res[i][j]+A[i][k]*B[k][j]%(mod-))%(mod-);
memcpy(A,res,sizeof res);
}
void mul2(ll A[][],ll B[][]){
ll res[][]={};
for(int i=;i<=;i++)
for(int j=;j<=k;j++)
for(int l=;l<=;l++)
res[i][j]=(res[i][j]+A[i][l]*B[l][j]%(mod-))%(mod-);
memcpy(B,res,sizeof res);
} ll Pow(ll a,ll b){
ll res=;
while(b){
if(b%)
res=res*a%mod;
b>>=;a=a*a%mod;
}
return res;
} int main(){
cin>>n>>f1>>f2>>f3>>c;
divide(f1);divide(f2);divide(f3);divide(c);
for(auto it:s)
p[++k]=it;
calc(f1*c,);
calc(f2*c,);calc(c,);
calc(f3*c,);calc(c,);calc(c,);
A[][]=;A[][]=;A[][]=;
A[][]=;A[][]=;A[][]=;
A[][]=;A[][]=;A[][]=; ll b=n-,res[][]={};
for(int i=;i<=;i++)
res[i][i]=;
while(b){
if(b%)
mul1(res,A);
b>>=;mul1(A,A);
} mul2(res,E); ll ans=;//ans=c^n * fn
for(int i=;i<=k;i++)
ans=ans*Pow(p[i],E[][i])%mod;
ll tmp=Pow(c,n);
tmp=Pow(tmp,mod-);//求逆元
ans=ans*tmp%mod;
cout<<ans<<'\n';
}
*/
欧拉定理+质因子分解+矩阵快速幂——cf1182E的更多相关文章
- HDU4549 M斐波那契数列 矩阵快速幂+欧拉函数+欧拉定理
M斐波那契数列 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Sub ...
- [bzoj 1409] Password 矩阵快速幂+欧拉函数
考试的时候想到了矩阵快速幂+快速幂,但是忘(bu)了(hui)欧拉定理. 然后gg了35分. 题目显而易见,让求一个数的幂,幂是斐波那契数列里的一项,考虑到斐波那契也很大,所以我们就需要欧拉定理了 p ...
- 【BZOJ2875】随机数生成器(矩阵快速幂)
[BZOJ2875]随机数生成器(矩阵快速幂) 题面 Description 栋栋最近迷上了随机算法,而随机数是生成随机算法的基础.栋栋准备使用线性同余法(Linear Congruential Me ...
- HDU 2243考研路茫茫——单词情结 (AC自动机+矩阵快速幂)
背单词,始终是复习英语的重要环节.在荒废了3年大学生涯后,Lele也终于要开始背单词了. 一天,Lele在某本单词书上看到了一个根据词根来背单词的方法.比如"ab",放在单词前一般 ...
- CF1106F Lunar New Year and a Recursive Sequence 原根、矩阵快速幂、BSGS
传送门 好久没写数论题了写一次调了1h 首先发现递推式是一个乘方的形式,线性递推和矩阵快速幂似乎都做不了,那么是否能够把乘方运算变成加法运算和乘法运算呢? 使用原根!学过\(NTT\)的都知道\(99 ...
- 【BZOJ2875】【NOI2012】随机数生成器(矩阵快速幂)
[BZOJ2875]随机数生成器(矩阵快速幂) 题面 Description 栋栋最近迷上了随机算法,而随机数是生成随机算法的基础.栋栋准备使用线性同余法(Linear Congruential Me ...
- hdu 4549 M斐波拉契 (矩阵快速幂 + 费马小定理)
Problem DescriptionM斐波那契数列F[n]是一种整数数列,它的定义如下: F[0] = aF[1] = bF[n] = F[n-1] * F[n-2] ( n > 1 ) 现在 ...
- HDU 3221 矩阵快速幂+欧拉函数+降幂公式降幂
装载自:http://www.cnblogs.com/183zyz/archive/2012/05/11/2495401.html 题目让求一个函数调用了多少次.公式比较好推.f[n] = f[n-1 ...
- hdu4549矩阵快速幂+费马小定理
转移矩阵很容易求就是|0 1|,第一项是|0| |1 1| |1| 然后直接矩阵快速幂,要用到费马小定理 :假如p是质数,且gcd(a,p)=1,那么 a(p-1)≡1(m ...
随机推荐
- canvas的基础入门
canvas是定义在浏览器上的画布.它不仅仅是一个标签元素更是一个编程工具是一套编程的接口.利用它可以开发出很多东西,比如动画,游戏,动态的图表等富有变现力和感染力的应用.还可以开发出绚丽的3D动态效 ...
- redis String 相关命令
- session之memcache
nginx服务器配置:192.168.200.111[root@nginx ~]# hostname nginx[root@nginx ~]# bash[root@nginx ~]# vim /usr ...
- 关于使用AWS的centos
AWS的centos在版本上有些许不同. 当使用6代的时候,默认的登录用户是root 使用7代的系统,默认的登录用户是centos 否则登录不上去
- boost asio acceptor 构造
boost::asio::io_service io_svc; boost::asio::ip::address_v4 lis_ip; // 默认监听本机所有IP boost::asio::ip::t ...
- Redmine 和GitBlit仓库服务器整合
运行环境: RedMine: 4.0.4 Git 仓库: Gitbilt V1.8.0 必须: Redmine 安装并可运行 Redmine运行的主机里面已经安装了 Git,因需要在命令行中运行 gi ...
- Windows API DOC
{ /* https://docs.microsoft.com/zh-cn/?view=sql-server-ver15 */ }
- 【转载】Visual Studio + VA 常用快捷键
有过几年没怎么做window开发,发现回头再用VS忘记了好多快捷键,好记性真是不如烂笔头. 快捷键习惯设置:Tools->Options->Keyboard:Apply the follo ...
- thinkphp PATH_INFO支持
如果发生在本地测试正常,但是一旦部署到服务器环境后会发生只能访问首页的情况,很有可能是你的服务器或者空间不支持PATH_INFO所致. 系统内置提供了对PATH_INFO的兼容判断处理,但是不能确保在 ...
- php给每个数组元素加上前缀
比如原数组是 array('1','2','3','4'); 我需要得到的结果 array('aaa1','aaa2','aaa3','aaa4'); 用内置函数如何实现? array_walk() ...