CF1106F Lunar New Year and a Recursive Sequence——矩阵快速幂&&bsgs
题意
设 $$f_i = \left\{\begin{matrix}
1 , \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ i < k\\
\prod_{j=1}^k f_{i-j}^{b_j} \ mod \ p, \ \ \ \ \ i > k
\end{matrix}\right.$$
求 $f_k$($1 \leq f_k < p$),使得 $f_m = n$.($1 \leq k\leq 100$)
分析
$f_n$ 可以表示成 ${f_k}^x$ 的形式,也就是指数的线性递推式,用矩阵快速幂求出最终 $f_n$ 中的次数就行了。
$$\begin{bmatrix} f_k\\ f_{k-1}\\ \vdots \\ f_1 \end{bmatrix} =
\begin{bmatrix} b_1 & b_2 & \cdots & b_k\\ 1 & 0 & 0 & 0\\ \vdots & \ddots & \vdots & \vdots \\ 0 & 0 & 1 & 0 \end{bmatrix} \cdot
\begin{bmatrix} f_{k-1}\\ f_{k-2}\\ \vdots \\ f_0 \end{bmatrix}$$
即 $F_n = B\cdot F_{n-1} = B^{n-k}F_k$
那么就是 ${f_k}^x \equiv f_n \ (mod p) $ 形式了,其中 $x$ 是已经用矩阵快速幂算出来的。
于是就是关于形如 $x^a\equiv b\pmod{p}$ 方程的求解,直接用模板。
其中998244353的原根为3,算常识了吧。
注意算矩阵快速幂时,模并不是 $p$,由欧拉定理,模是 $p-1$.
#include<bits/stdc++.h>
using namespace std; typedef long long ll;
struct matrix
{
int r, c;
ll mat[][];
matrix(){
memset(mat, , sizeof(mat));
}
};
const ll p = ;
int k, b[], n, m; matrix mul(matrix A, matrix B, ll p) //矩阵相乘
{
matrix ret;
ret.r = A.r; ret.c = B.c;
for(int i = ;i < A.r;i++)
for(int k = ;k < A.c;k++)
for(int j = ;j < B.c;j++)
{
ret.mat[i][j] = (ret.mat[i][j] + A.mat[i][k] * B.mat[k][j]) % p;
}
return ret;
} matrix mpow(matrix A, int n, int p)
{
matrix ret;
ret.r = A.r; ret.c = A.c;
for(int i = ;i < ret.r;i++) ret.mat[i][i] = ;
while(n)
{
if(n & ) ret = mul(ret, A, p);
A = mul(A, A, p);
n >>= ;
}
return ret;
} ll gcd(ll a, ll b)
{
return b ? gcd(b, a%b) : a;
} ll qpow(ll a, ll b, ll p)
{
a = a % p;
ll ret = ;
while(b)
{
if(b&) ret = ret * a % p;
a = a * a %p;
b >>= ;
}
return ret % p;
} map<int,int>mp;
int bsgs(int a, int b, int p){ //a^x = b (mod P),(a,p)=1,返回x,x>=1
int m=sqrt(p)+;mp.clear();
for(register int i=,res=b;i<m;++i,res=1ll*res*a%p)mp[res]=i;
for(register int i=,tmp=qpow(a,m,p),res=tmp;i<=m+;++i,res=1ll*res*tmp%p)
if(mp.count(res))return i*m-mp[res];
return -;
} int main()
{
scanf("%d", &k);
for(int i = ;i <= k;i++) scanf("%d", &b[i]);
scanf("%d%d", &n, &m);
matrix B;
B.r = B.c = k;
for(int i = ;i < k;i++) B.mat[][i] = b[i+];
for(int i = ;i < k;i++) B.mat[i][i-] = ; B = mpow(B, n-k, p-);
int a = B.mat[][] % (p-); //注意,是模p-1 而非p int c = bsgs(qpow(, a, p), m, p);
if(c == -) printf("-1\n");
else
{
int fk = qpow(, c, p);
printf("%d\n", fk);
}
}
参考链接:https://www.cnblogs.com/bztMinamoto/p/10348641.html
CF1106F Lunar New Year and a Recursive Sequence——矩阵快速幂&&bsgs的更多相关文章
- HDU5950 Recursive sequence (矩阵快速幂加速递推) (2016ACM/ICPC亚洲赛区沈阳站 Problem C)
题目链接:传送门 题目: Recursive sequence Time Limit: / MS (Java/Others) Memory Limit: / K (Java/Others) Total ...
- HDU5950 Recursive sequence —— 矩阵快速幂
题目链接:https://vjudge.net/problem/HDU-5950 Recursive sequence Time Limit: 2000/1000 MS (Java/Others) ...
- 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 5950 Recursive sequence 矩阵快速幂
Recursive sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Other ...
- HDU5950 Recursive sequence (矩阵快速幂)
Recursive sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Other ...
- 5950 Recursive sequence (矩阵快速幂)
题意:递推公式 Fn = Fn-1 + 2 * Fn-2 + n*n,让求 Fn; 析:很明显的矩阵快速幂,因为这个很像Fibonacci数列,所以我们考虑是矩阵,然后我们进行推公式,因为这样我们是无 ...
- CF1106F Lunar New Year and a Recursive Sequence
题目链接:CF1106F Lunar New Year and a Recursive Sequence 大意:已知\(f_1,f_2,\cdots,f_{k-1}\)和\(b_1,b_2,\cdot ...
- hdu-5667 Sequence(矩阵快速幂+费马小定理+快速幂)
题目链接: Sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- UVA - 10689 Yet another Number Sequence 矩阵快速幂
Yet another Number Sequence Let’s define another number sequence, given by the foll ...
随机推荐
- Spring笔记4
Spring中的JdbcTemplate JdbcTemplate:他是spring框架中提供的一个对象,是对原始Jdbc API对象的简单封装. JdbcTemplate的作用:用于和数据库交互的, ...
- day40——数据库、数据库分类、安装、修改密码、字符集编码、简单语句介绍
day40 详情请看:https://www.cnblogs.com/clschao/articles/9907529.html 数据库 数据库 简而言之可视为电子化的文件柜--存储电子文件的处所,用 ...
- PAT(B) 1040 有几个PAT(Java)
题目链接:1040 有几个PAT (25 point(s)) 题目描述 字符串 APPAPT 中包含了两个单词 PAT,其中第一个 PAT 是第 2 位§,第 4 位(A),第 6 位(T):第二个 ...
- jwt 0.9.0 系列目录
jwt官网地址:https://jwt.io/ PS: 写此系列的时候,jjwt jar包版本是0.9.0 <dependency> <groupId>io.jsonwe ...
- Hadoop2.8.4集群配置
建hadoop用户 #添加用户hadoop adduser hadoop 这个过程中需要输入密码两次 Enter new password: Retype new password: passwd: ...
- ORACLE存储过程,循环语法和游标
1.定义所谓存储过程(Stored Procedure),就是一组用于完成特定数据库功能的SQL语句集,该SQL语句集经过编译后存储在数据库系统中.在使用时候,用户通过指定已经定义的存储过程名字并给出 ...
- 二进制方式安装Kubernetes 1.14.2高可用详细步骤
00.组件版本和配置策略 组件版本 Kubernetes 1.14.2 Docker 18.09.6-ce Etcd 3.3.13 Flanneld 0.11.0 插件: Coredns Dashbo ...
- Oracle数据库连接超时
关于Oracle数据库的连接失败问题,有N种情况都会导致,这次遇到的是一般开发或者运维人员难以发现的 场景: 有一台机A能够正常连接数据库并正常运行,机器B连接失败 32位WebService程序基于 ...
- DevExtreme学习笔记(一)treeView(搜索固定、节点展开和收缩)注意事项
var treeConfig1 = dxConfig.treeView(obj_Question.treeDataSource1); treeConfig1.selectionMode = 'sing ...
- .net core使用ocelot---第五篇 服务质量
简介 .net core使用ocelot---第一篇 简单使用 .net core使用ocelot---第二篇 身份验证使用 .net core使用ocelot---第三篇 日志记录 .net c ...