HDU 5667 Sequence 矩阵快速幂
官方题解:
观察递推式我们可以发现,所有的fi都是a的幂次,所以我们可以对fi取一个以a为底的log,gi=loga fi
那么递推式变gi=b+c∗gi−1+gi−2,这个式子可以矩阵乘法
这题有一个小trick,注意a mod p=0的情况.
分析:排除了a mod p=0的情况,幂次可以对(p-1)取模,这是由于离散对数定理
相关定理请查阅 算导
吐槽:比赛的时候就是被a mod p=0这种情况给hack掉了,我太弱了
#include <stdio.h>
#include <iostream>
#include <vector>
#include <math.h>
#include <set>
#include <map>
#include <queue>
#include <algorithm>
#include <string.h>
#include <string>
using namespace std;
typedef long long LL;
const int INF=0x3f3f3f3f;
const int N=1e5+;
LL p,a,b,c,n;
struct asd{
LL c[][];
};
asd mul(asd a,asd b){
asd d;
for(int i=;i<=;++i){
for(int j=;j<=;++j){
d.c[i][j]=;
for(int k=;k<=;++k)
d.c[i][j]=(d.c[i][j]+a.c[i][k]*b.c[k][j]%(p-))%(p-);
}
}
return d;
}
asd fun(LL m){
asd a,e;
for(int i=;i<=;++i)
for(int j=;j<=;++j)
a.c[i][j]=e.c[i][j]=;
a.c[][]=c;
a.c[][]=;
a.c[][]=b;
a.c[][]=;
a.c[][]=;
e.c[][]=e.c[][]=e.c[][]=;
while(m){
if(m&)e=mul(e,a);
m>>=;
a=mul(a,a);
}
return e;
}
LL fun2(LL a,LL x){
LL res=;
while(x){
if(x&)res=(res*a)%p;
x>>=;
a=(a*a)%p;
}
return res;
}
int main()
{
int T;
scanf("%d",&T);
while(T--){
scanf("%I64d%I64d%I64d%I64d%I64d",&n,&a,&b,&c,&p);
if(n==){
printf("1\n");
continue;
}
if(n==){
printf("%I64d\n",fun2(a,b));
continue;
}
if(a%p==){
printf("0\n");
continue;
}
asd t=fun(n-);
LL x=;
x=(x+t.c[][]*b%(p-))%(p-);
x=(x+t.c[][])%(p-);
printf("%I64d\n",fun2(a,x));
}
return ;
}
HDU 5667 Sequence 矩阵快速幂的更多相关文章
- HDU 5667 Sequence 矩阵快速幂+费马小定理
题目不难懂.式子是一个递推式,并且不难发现f[n]都是a的整数次幂.(f[1]=a0;f[2]=ab;f[3]=ab*f[2]c*f[1]...) 我们先只看指数部分,设h[n]. 则 h[1]=0; ...
- HDU 5667 构造矩阵快速幂
HDU 5667 构造矩阵快速幂 题目描述 解析 我们根据递推公式 设 则可得到Q的指数关系式 求Q构造矩阵 同时有公式 其中φ为欧拉函数,且当p为质数时有 代码 #include <cstdi ...
- HDU.2640 Queuing (矩阵快速幂)
HDU.2640 Queuing (矩阵快速幂) 题意分析 不妨令f为1,m为0,那么题目的意思为,求长度为n的01序列,求其中不含111或者101这样串的个数对M取模的值. 用F(n)表示串长为n的 ...
- HDU - 1005 Number Sequence 矩阵快速幂
HDU - 1005 Number Sequence Problem Description A number sequence is defined as follows:f(1) = 1, f(2 ...
- HDU 5950 - Recursive sequence - [矩阵快速幂加速递推][2016ACM/ICPC亚洲区沈阳站 Problem C]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5950 Farmer John likes to play mathematics games with ...
- HDU 1005 Number Sequence(矩阵快速幂,快速幂模板)
Problem Description A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1 ...
- HDU - 1005 -Number Sequence(矩阵快速幂系数变式)
A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) m ...
- E - Recursive sequence HDU - 5950 (矩阵快速幂)
题目链接:https://vjudge.net/problem/HDU-5950 思路: 构造矩阵,然后利用矩阵快速幂. 1 #include <bits/stdc++.h> 2 #inc ...
- hdu-5667 Sequence(矩阵快速幂+费马小定理+快速幂)
题目链接: Sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
随机推荐
- opensuse安装mysql-workbench
首先安装好mysqlserver,做本地测试其实不用安装mysqlclient. 到http://software.opensuse.org/package/mysql-workbench 下载相应版 ...
- msSQL数据库备份还原小结
MSSQL自带了一个样例数据库pubs,就拿这个举例好了. 首先,来一次完全备份.对于数据量很大的数据库,这样的操作当然很费时间.所以我们采用每天凌晨4点一次完全备份,每个小时一个差异备份,每分钟一次 ...
- NHibernate多对多关联映射的实现
上次用EF演示了数据库多对多关系的操作,这次我们还是引用上次的案例,来演示如何在C#当中使用NHibernate. 首先介绍一下NHibernate框架的来源.熟悉Java编程的读者肯定知道Hiber ...
- 微信公众号-5秒内不回复测试并处理方案,顺便复习php 时间执行
在index.php中 file_put_contents('has_request.txt','请求时间:'.date('YmdHis')."\n",FILE_APPEND); ...
- javascript操作html元素CSS属性
下面先记录一下JS控制CSS所使用的方法. 1.使用javascript更改某个css class的属性... <style type="text/css"> .ori ...
- RasAPI函数实现PPPOE拨号
unit uDial; interface uses Windows,Messages, SysUtils, Ras;// Classes; var //EntryName,UserName,Pass ...
- CODEVS 2102 石子归并 2
[题目描述 Descriptin] 在一个园形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分.试设计出1个算法, ...
- Catch Application Exceptions in a Windows Forms Application
You need to handle the System.Windows.Forms.Application.ThreadException event for Windows Forms. Thi ...
- struts2 查 找总结
0:38 2013/5/25 查 找 * * |-_-查找全部 Action层的home方法中的查找方法创建时不需要带个查找对象的参数 service层不用组织条件 dao层一条查询所有的hql语句S ...
- sizeof()函数求各类型变量所占空间的方法
#include "stdafx.h" #include <iostream> using namespace std; ]) { cout<<sizeof ...