好题!

/*
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的更多相关文章

  1. HDU4549 M斐波那契数列 矩阵快速幂+欧拉函数+欧拉定理

    M斐波那契数列 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Sub ...

  2. [bzoj 1409] Password 矩阵快速幂+欧拉函数

    考试的时候想到了矩阵快速幂+快速幂,但是忘(bu)了(hui)欧拉定理. 然后gg了35分. 题目显而易见,让求一个数的幂,幂是斐波那契数列里的一项,考虑到斐波那契也很大,所以我们就需要欧拉定理了 p ...

  3. 【BZOJ2875】随机数生成器(矩阵快速幂)

    [BZOJ2875]随机数生成器(矩阵快速幂) 题面 Description 栋栋最近迷上了随机算法,而随机数是生成随机算法的基础.栋栋准备使用线性同余法(Linear Congruential Me ...

  4. HDU 2243考研路茫茫——单词情结 (AC自动机+矩阵快速幂)

    背单词,始终是复习英语的重要环节.在荒废了3年大学生涯后,Lele也终于要开始背单词了. 一天,Lele在某本单词书上看到了一个根据词根来背单词的方法.比如"ab",放在单词前一般 ...

  5. CF1106F Lunar New Year and a Recursive Sequence 原根、矩阵快速幂、BSGS

    传送门 好久没写数论题了写一次调了1h 首先发现递推式是一个乘方的形式,线性递推和矩阵快速幂似乎都做不了,那么是否能够把乘方运算变成加法运算和乘法运算呢? 使用原根!学过\(NTT\)的都知道\(99 ...

  6. 【BZOJ2875】【NOI2012】随机数生成器(矩阵快速幂)

    [BZOJ2875]随机数生成器(矩阵快速幂) 题面 Description 栋栋最近迷上了随机算法,而随机数是生成随机算法的基础.栋栋准备使用线性同余法(Linear Congruential Me ...

  7. hdu 4549 M斐波拉契 (矩阵快速幂 + 费马小定理)

    Problem DescriptionM斐波那契数列F[n]是一种整数数列,它的定义如下: F[0] = aF[1] = bF[n] = F[n-1] * F[n-2] ( n > 1 ) 现在 ...

  8. HDU 3221 矩阵快速幂+欧拉函数+降幂公式降幂

    装载自:http://www.cnblogs.com/183zyz/archive/2012/05/11/2495401.html 题目让求一个函数调用了多少次.公式比较好推.f[n] = f[n-1 ...

  9. hdu4549矩阵快速幂+费马小定理

    转移矩阵很容易求就是|0  1|,第一项是|0| |1  1|             |1| 然后直接矩阵快速幂,要用到费马小定理 :假如p是质数,且gcd(a,p)=1,那么 a(p-1)≡1(m ...

随机推荐

  1. 基于LNMP部署DiscuzX

    [root@nginx~]# unzip ComsenzDiscuz-DiscuzX-master.zip[root@nginxDiscuzX]# mv upload/ /usr/local/ngin ...

  2. 多线程中的detach

    从 thread 对象分离执行的线程,允许执行独立地持续.一旦线程退出,则释放所有分配的资源.(就是两个线程彼此相互独立) 调用 detach 后, *this 不再占有任何线程. #include ...

  3. BCZM: Chapter 1

    1.1 CPU 占用率 https://www.cnblogs.com/TenosDoIt/p/3242910.html 1.2 中国象棋将帅 https://blog.csdn.net/kabini ...

  4. 30 System类

    System类代表系统,系统级的很多属性和控制方法都放置在该类的内部.该类位于java.lang包.由于该类的构造方法是private的,所以无法创建该类的对象,也就是无法实例化该类.其内部的成员变量 ...

  5. delphi 特殊窗体

    delphi 窗体阴影 放窗体创建事件里面 SetClassLong(Handle, GCL_STYLE, GetClassLong(Handle, GCL_STYLE) or CS_DROPSHAD ...

  6. NX二次开发-UFUN单按钮模态对话框窗口打印uc1601用法

    NX9+VS2012 #include <uf.h> #include <uf_ui.h> UF_initialize(); //方法1(uc1601) uc1601();// ...

  7. 尚学python课程---15、python进阶语法

    尚学python课程---15.python进阶语法 一.总结 一句话总结: python使用东西要引入库,比如 json 1.python如何创建类? class ClassName: :以冒号结尾 ...

  8. P1613 跑路(倍增)

    P1613 跑路(倍增) 题目描述 小A的工作不仅繁琐,更有苛刻的规定,要求小A每天早上在6:00之前到达公司,否则这个月工资清零.可是小A偏偏又有赖床的坏毛病.于是为了保住自己的工资,小A买了一个十 ...

  9. Perl 数组应用详解(push, pop, shift, unshift)

    Perl的数组操作有四大常用函数: push:从数组的末尾加入元素.pop :从数组的末尾取出元素 shift: 从数组的开头取出元素unshift:从数组的开头加入元素 1.push #!/usr/ ...

  10. kafka 批量添加topic 副本数

    shell 脚本: 1)列出只有一个副本的topic,保存到一个文件中: [root@hdp05 src]# cat fush.sh #!/bin/bash # topics=`/usr/hdp//k ...