HDU 5451——递推式&&循环节
题意
设 $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——递推式&&循环节的更多相关文章
- "红色病毒"问题 HDU 2065 递推+找循环节
题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=2065 递推类题目, 可以考虑用数学方法来做, 但是明显也可以有递推思维来理解. 递推的话基本就是状态 ...
- 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 ...
- 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) + ...
- HDU - 2604 Queuing(递推式+矩阵快速幂)
Queuing Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- 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 ...
- ZOJ 3182 HDU 2842递推
ZOJ 3182 Nine Interlinks 题目大意:把一些带标号的环套到棍子上,标号为1的可以所以操作,标号i的根子在棍子上时,只有它标号比它小的换都不在棍子上,才能把标号为i+1的环,放在棍 ...
- 矩阵乘法&矩阵快速幂&矩阵快速幂解决线性递推式
矩阵乘法,顾名思义矩阵与矩阵相乘, 两矩阵可相乘的前提:第一个矩阵的行与第二个矩阵的列相等 相乘原则: a b * A B = a*A+b*C a*c+b*D c d ...
- P1067Warcraft III 守望者的烦恼(十大矩阵问题之七求递推式)
https://vijos.org/p/1067 守望者-warden,长期在暗夜精灵的的首都艾萨琳内担任视察监狱的任务,监狱是成长条行的,守望者warden拥有一个技能名叫“闪烁”,这个技能可以把她 ...
- Tyche 2191 WYF的递推式
题目描述 WYF手中有这样一条递推式 WYF并不是想让你帮他做出结果,事实上,给定一个n,他能够迅速算出Fn.WYF只是想单纯的考验一下读者们. 输入描述 仅一行,三个整数N,F1,P 输出描述 仅一 ...
随机推荐
- CNN-1: LeNet-5 卷积神经网络模型
1.LeNet-5模型简介 LeNet-5 模型是 Yann LeCun 教授于 1998 年在论文 Gradient-based learning applied to document ...
- 【坑】mysql 8.0以后的驱动 jar、连接池的变化
文章目录 前言 com.mysql.cj.jdbc.Driver 后记 前言 博主公司刚配置了新电脑,安装开发环境的时候,美滋滋的将开发工具都装了新版本,结果在使用 mysql 的时候,发现一直链接数 ...
- vm启动时通过U盘安装的方法
vm启动时通过U盘安装的方法 增加一个以U盘为硬盘的方法,通过boot中设置该硬盘启动后重新ghost或者安装win10X64位. 在虚拟机中增加一个硬盘,第二部设置为物理硬盘,选在对 ...
- 【解决方法】You seem to have the current working directory in your LD_LIBRARY_PATH environment variable.
参考地址:https://blog.csdn.net/qq_24755999/article/details/78722788 You seem to have the current working ...
- 音视频入门-04-BMP图像四字节对齐的问题
* 音视频入门文章目录 * BMP 图像四字节对齐 表示 BMP 位图中像素的位元是以行为单位对齐存储的,每一行的大小都向上取整为4字节(32 位 DWORD)的倍数.如果图像的高度大于 1,多个经过 ...
- hdu 4501三重包问题
好好理解一下背包问题 从01包入手 内层的循环 是为了以后求解记录数据 因为只有一个取舍问题 所以只需要一层循环就可以 这里有三个背包 钱 积分 以及免费物品 那么 就需要三重循环 #include& ...
- c#基础知识梳理(三)
上期回顾 - https://www.cnblogs.com/liu-jinxin/p/10824638.html 一.方法 一个方法是把一些相关的语句组织在一起,用来执行一个任务的语句块.每一个 C ...
- Redis 简单使用 and 连接池(python)
Redis 简介 NoSQL(not only sql):非关系型数据库 支持 key-value, list, set, zset, hash 等数据结构的存储:支持主从数据备份,集群:支持 ...
- 关于微信小程序的父子组件互相传值
一:父组件传值给子组件 1. 在父组件中引用子组件 1.1 在父组件json中导入子组件 1.2 在子组件的json中,把自己定义为子组件 2. 在父组件中,子组件的引用处,绑定一个属性( text ...
- MGB的生成代码解析
目录 @ 问题描述 文字描述 问题是在我刚刚学习MyBatis逆向工程时出现的,我发现使用Example是可以创建两个Criteria对象,并且两个对象也都可以添加条件,但是在运行过程中只会执行第一次 ...