题意

设 $y = (5+2\sqrt 6)^{1+2^x}$,给出 $x, M$($0\leq x \leq 2^{32}, M \leq 46337$),求 $[y]\%M$.

分析

由通项推递推式??

设 $A_n = (5 + 2\sqrt 6)^n, B_n = (5 - 2\sqrt 6)^n,C_n = A_n + B_n$,

显然 $C_n$ 是整数,且 $B_n$ 是小于1的,所以答案就是 $C_n - 1$.

通过推导:

$C_n = A_n + B_n = (5+2\sqrt6)^n +  (5-2\sqrt6)^n$

$C_{n+1} = A_{n+1} + B_{n+1} = (5+2\sqrt6)(5+2\sqrt6)^n +  (5-2\sqrt6)(5-2\sqrt6)^n$

$C_{n+2} = A_{n+2} + B_{n+2} = (49+20\sqrt6)(5+2\sqrt6)^n +  (49-20\sqrt6)(5-2\sqrt6)^n$,

观察得 $C_{n+2} = 10C_{n+1} - C_n$

写成矩阵快速幂的形式,即

$$\begin{bmatrix} C_n\\  C_{n-1} \end{bmatrix} = {\begin{bmatrix} 10 & -1\\  1 & 0 \end{bmatrix}}^{n-1}\begin{bmatrix} C_1\\  C_0 \end{bmatrix}$$

幂太大,直接用快速幂肯定TLE。

我们可以找循环节,

由于模和转移矩阵是确定的,可以暴力打表找规律。

也可以用结论,因为 $M$ 为素数,存在循环节 $(M+1)(M-1)$。这不一定是最小的循环节,可以枚举其因子找到最小的循环节。

#include<bits/stdc++.h>
using namespace std; typedef long long ll;
const int N=+;
ll x0,x1,a,b,n,mod;
char s[N]; const int maxn = + ; //p最为2e9,不会有两个超过1e5的质因数
int prime[maxn], pcnt; //prime[i]表示第i个素数
bool is_prime[maxn + ]; //is_prime[i]为true表示i是素数
int sieve(int n)
{
int cnt = ;
for (int i = ; i <= n; i++) is_prime[i] = true;
is_prime[] = is_prime[] = false;
for (ll i = ; i <= n; i++)
{
if (is_prime[i])
{
prime[cnt++] = i;
for (ll j = i * i; j <= n; j += i) is_prime[j] = false; //i * i可能爆int
}
}
return cnt;
} ll solve(ll x){
ll ans1=,ans2=,xx=x;
for(int i=;i<pcnt;i++){
if(1ll*prime[i]*prime[i]>x) break;
if(x%prime[i]==){
ans1*=(prime[i]-)*(prime[i]+);
ans2*=prime[i];
while(x%prime[i]==) x/=prime[i];
}
}
if(x>){
ans1*=(x-)*(x+);
ans2*=x;
}
return xx/ans2*ans1;
}
ll qmul(ll x,ll y,ll p){ //快速乘
x%=p;
y%=p;
ll ans=;
while(y){
if(y&){
ans+=x;
if(ans>=p) ans-=p; //这样写不能有负数
}
x<<=;
if(x>=p) x-=p;
y>>=;
}
return ans;
} struct Mat{
int r,c;
ll m[][];
Mat(){
memset(m,,sizeof(m));
}
}; Mat mmul(Mat x,Mat y,ll p){
Mat ans;
ans.r=x.r;
ans.c=y.c;
for(int i=;i<x.r;i++)
for(int k=;k<x.c;k++)
for(int j=;j<y.c;j++){
ans.m[i][j]+=qmul(x.m[i][k],y.m[k][j],p);
if(ans.m[i][j]>=p) ans.m[i][j]-=p;
}
return ans;
}
Mat mpow(Mat x,ll y,ll p){
Mat ans;
ans.r=x.r;
ans.c=x.c;
for(int i=;i<ans.c;i++) ans.m[i][i]=;
while(y){
if(y&) ans=mmul(ans,x,p);
x=mmul(x,x,p);
y>>=;
}
return ans;
}
int main(){
pcnt = sieve();
while(scanf("%lld%lld%lld%lld",&x0,&x1,&a,&b) == ){
scanf("%s%lld",s,&mod);
ll lop=solve(mod); //循环节长度
n=;
int lens=strlen(s);
for(int i=;i<lens;i++){
n=qmul(n,,lop)+s[i]-'';
if(n>=lop) n-=lop;
}
Mat A,T;
A.r=; A.c=;
A.m[][]=x1; A.m[][]=x0;
T.r=; T.c=;
T.m[][]=a; T.m[][]=b; T.m[][]=;
if(n>){
T=mpow(T,n-,mod);
A=mmul(T,A,mod);
}
printf("%lld\n",A.m[][]);
}
return ;
}

参考链接:https://www.cnblogs.com/addf/p/4834108.html

HDU 5451——递推式&&循环节的更多相关文章

  1. "红色病毒"问题 HDU 2065 递推+找循环节

    题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=2065 递推类题目, 可以考虑用数学方法来做, 但是明显也可以有递推思维来理解. 递推的话基本就是状态 ...

  2. HDU 1757 A Simple Math Problem 【矩阵经典7 构造矩阵递推式】

    任意门:http://acm.hdu.edu.cn/showproblem.php?pid=1757 A Simple Math Problem Time Limit: 3000/1000 MS (J ...

  3. hdu 1757 A Simple Math Problem (构造矩阵解决递推式问题)

    题意:有一个递推式f(x) 当 x < 10    f(x) = x.当 x >= 10  f(x) = a0 * f(x-1) + a1 * f(x-2) + a2 * f(x-3) + ...

  4. HDU - 2604 Queuing(递推式+矩阵快速幂)

    Queuing Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  5. hdu 5950 Recursive sequence 递推式 矩阵快速幂

    题目链接 题意 给定\(c_0,c_1,求c_n(c_0,c_1,n\lt 2^{31})\),递推公式为 \[c_i=c_{i-1}+2c_{i-2}+i^4\] 思路 参考 将递推式改写\[\be ...

  6. ZOJ 3182 HDU 2842递推

    ZOJ 3182 Nine Interlinks 题目大意:把一些带标号的环套到棍子上,标号为1的可以所以操作,标号i的根子在棍子上时,只有它标号比它小的换都不在棍子上,才能把标号为i+1的环,放在棍 ...

  7. 矩阵乘法&矩阵快速幂&矩阵快速幂解决线性递推式

    矩阵乘法,顾名思义矩阵与矩阵相乘, 两矩阵可相乘的前提:第一个矩阵的行与第二个矩阵的列相等 相乘原则: a b     *     A B   =   a*A+b*C  a*c+b*D c d     ...

  8. P1067Warcraft III 守望者的烦恼(十大矩阵问题之七求递推式)

    https://vijos.org/p/1067 守望者-warden,长期在暗夜精灵的的首都艾萨琳内担任视察监狱的任务,监狱是成长条行的,守望者warden拥有一个技能名叫“闪烁”,这个技能可以把她 ...

  9. Tyche 2191 WYF的递推式

    题目描述 WYF手中有这样一条递推式 WYF并不是想让你帮他做出结果,事实上,给定一个n,他能够迅速算出Fn.WYF只是想单纯的考验一下读者们. 输入描述 仅一行,三个整数N,F1,P 输出描述 仅一 ...

随机推荐

  1. BeginLinux Programming chapter16: X11桌面系统简介

    当前两个最流行的linux desktop environment: GNOME 和KDE, 两者对应的图形库分别是 GTK+ 和 QT. GNOME与KDE与X11的关系: X defines no ...

  2. 封装Json+日志

    /** * 输出json * @param $msg * @param int $errno */ public function printOutError($msg = '操作失败', $errn ...

  3. Excel逻辑运算函数

    Excel逻辑运算函数 1.FALSE和TRUE的使用 ​ 筛选出表中salary>6.gender为男.age>28至少满足这三个条件中的两个的数据 1.依次使用:=C2>6.=D ...

  4. Android 卸载应用程序

    最近工作中接触Android应用实现卸载自身的逻辑,踩了一些坑之后整理下来.使用的方法是Intent.ACTION_DELETE,这里没有什么好说的. MainActivity.java : pack ...

  5. spring cloud微服务实践七

    在spring cloud 2.x以后,由于zuul一直停滞在1.x版本,所以spring官方就自己开发了一个项目 Spring Cloud Gateway.作为spring cloud微服务的网关组 ...

  6. C++ std::string 在一个字符串前插入一个字符串几种方式

    目录 1.直接使用字符串相加 2.使用insert函数 比较:通过Quick C++ Benchmarks 可得到结果 1.直接使用字符串相加 std::string a = "hello& ...

  7. python 虚拟环境 venv 简单用法

    Python3.3以上的版本通过venv模块原生支持虚拟环境,可以代替Python之前的virtualenv.该venv模块提供了创建轻量级“虚拟环境”,提供与系统Python的隔离支持.每一个虚拟环 ...

  8. Sparse PCA 稀疏主成分分析

    Sparse PCA 稀疏主成分分析 2016-12-06 16:58:38 qilin2016 阅读数 15677 文章标签: 统计学习算法 更多 分类专栏: Machine Learning   ...

  9. java jdbc 链接mysq 测试l 云服务器 和云数据库 mysql DB

    话不多说直接上效果图 下面给出参考代码: package com.humi.db; import java.sql.Connection; import java.sql.DriverManager; ...

  10. 关于js异步的一些知识点

    1,什么是单线程,和异步有什么关系 单线程-只有一个线程,只能做一件事 单线程的原因:避免DOM 渲染的冲突 浏览器需要渲染DOM JS 可以修改DOM 结构 JS 执行的时候,浏览器DOM 渲染会暂 ...