已知\(f_i = \prod \limits_{j = 1}^k f_{i - j}^{b_j}\;mod\;998244353\),并且\(f_1, f_2, ..., f_{k - 1} = 1\),\(f_k = a\),已知\(f_n = m\),试求\(a\)

易知\(f_n = f_k^p\)

对于\(p\)满足递推式\(g[i] = \sum \limits_{j = 1}^k b[j] * g[i - j]\)

这是常系数线性递推,由于\(k \leq 100\),因此矩阵快速幂即可

那么问题就变为了\(f_k^p = m(\;mod\;998244353)\),求\(f_k\)

由于\(998244353\)的原根为\(3\),因此把\(m\)离散之后,可以写出方程

令\(f_k = 3^s(mod\;998244353)\),\(m = 3^t\),那么有\(3^{sp} = 3^t (mod\;998244353)\)

由欧拉定理\(sp = t(mod\;998244352)\),然后解一下这个同余方程

有解则输出,无解就无解

复杂度\(O(k^3 \log n + \sqrt{998244353})\)


#include <map>
#include <queue>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std; #define de double
#define ll long long
#define ri register int
#define rep(io, st, ed) for(ri io = st; io <= ed; io ++)
#define drep(io, ed, st) for(ri io = ed; io >= st; io --) #define gc getchar
inline int read() {
int p = 0, w = 1; char c = gc();
while(c > '9' || c < '0') { if(c == '-') w = -1; c = gc(); }
while(c >= '0' && c <= '9') p = p * 10 + c - '0', c = gc();
return p * w;
} const int sid = 105;
const int mod = 998244353;
const int g = 3; inline int mul(int a, int b) { return 1ll * a * b % mod; }
inline int fp(int a, int k) {
int ret = 1;
for( ; k; k >>= 1, a = mul(a, a))
if(k & 1) ret = mul(ret, a);
return ret;
} int n, m, k, b[sid];
struct mtx {
int f[sid][sid];
mtx() {}
mtx(int flag) {
if(flag == 0) {
for(int i = 0; i < k; i ++)
for(int j = 0; j < k; j ++)
f[i][j] = 0;
}
if(flag == 1) {
for(int i = 0; i < k; i ++)
for(int j = 0; j < k; j ++)
f[i][j] = (i == j) ? 1 : 0;
}
}
int* operator [] (const int x) {
return f[x];
}
friend mtx operator * (mtx a, mtx b) {
mtx c(0);
for(int i = 0; i < k; i ++)
for(int j = 0; j < k; j ++)
for(int p = 0; p < k; p ++)
c[i][j] = (c[i][j] + 1ll * a[i][p] * b[p][j] % (mod - 1)) % (mod - 1);
return c;
}
} A, B; inline mtx fp(mtx a, int k) {
mtx ret(1);
for( ; k; k >>= 1, a = a * a)
if(k & 1) ret = ret * a;
return ret;
} map <int, int> H;
inline int BSGS(int A, int B) {
H.clear(); H[1] = 0;
int Ai = 1, Aj = 1, m = ceil(sqrt(mod));
for(ri i = 1; i < m; i ++) Ai = 1ll * Ai * A % mod, H[1ll * Ai * B % mod] = i;
Ai = 1ll * Ai * A % mod;
for(ri i = 1; i <= m; i ++) {
Aj = 1ll * Aj * Ai % mod;
if(H[Aj]) return 1ll * i * m - H[Aj];
}
} inline int gcd(int a, int b) {
return b ? gcd(b, a % b) : a;
} inline void exgcd(int &x, int &y, int a, int b) {
if(!b) { x = 1; y = 0; return; }
exgcd(y, x, b, a % b); y -= a / b * x;
} inline void Solve() {
A[0][k - 1] = 1;
rep (i, 0, k - 1) B[i][k - 1] = b[k - i];
rep (i, 0, k - 2) B[i + 1][i] = 1; A = A * fp(B, n - k); int p = A[0][k - 1], t = BSGS(g, m);
if(t % gcd(p, mod - 1)) printf("-1\n");
else {
int gd = gcd(p, mod - 1);
int x, y, a = p, b = mod - 1;
t /= gd; a /= gd; b /= gd;
exgcd(x, y, a, b);
x = (x + mod - 1) % (mod - 1);
x = 1ll * x * t % (mod - 1);
printf("%d\n", fp(g, x));
}
} int main() {
k = read();
rep(i, 1, k) b[i] = read();
n = read(); m = read();
Solve();
return 0;
}

CF1106F Lunar New Year and a Recursive Sequence 线性递推 + k次剩余的更多相关文章

  1. 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 ...

  2. HDU 5950 Recursive sequence 【递推+矩阵快速幂】 (2016ACM/ICPC亚洲区沈阳站)

    Recursive sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Other ...

  3. HDU5950 Recursive sequence 非线性递推式 矩阵快速幂

    题目传送门 题目描述:给出一个数列的第一项和第二项,计算第n项. 递推式是 f(n)=f(n-1)+2*f(n-2)+n^4. 由于n很大,所以肯定是矩阵快速幂的题目,但是矩阵快速幂只能解决线性的问题 ...

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

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

  5. CF1106F Lunar New Year and a Recursive Sequence(矩阵快速幂+bsgs+exgcd)

    题面 传送门 前置芝士 \(BSGS\) 什么?你不会\(BSGS\)?百度啊 原根 对于素数\(p\)和自然数\(a\),如果满足\(a^x\equiv 1\pmod{p}\)的最小的\(x\)为\ ...

  6. CF1106F Lunar New Year and a Recursive Sequence——矩阵快速幂&&bsgs

    题意 设 $$f_i = \left\{\begin{matrix}1 , \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \  i < k\\ ...

  7. [HDOJ5950]Recursive sequence(递推,二项展开,矩阵快速幂)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5950 题意:求解递推式f(n)=f(n-1)+2*f(n-2)+n^4. 写了个小东西,不过我的文章里 ...

  8. Codeforces 1106F Lunar New Year and a Recursive Sequence | BSGS/exgcd/矩阵乘法

    我诈尸啦! 高三退役选手好不容易抛弃天利和金考卷打场CF,结果打得和shi一样--还因为queue太长而unrated了!一个学期不敲代码实在是忘干净了-- 没分该没分,考题还是要订正的 =v= 欢迎 ...

  9. POJ_1019 Number Sequence 【递推】

    题目: A single positive integer i is given. Write a program to find the digit located in the position ...

随机推荐

  1. 通过全备+主从同步恢复被drop的库或表

    MySQL 中drop 等高危误操作后恢复方法 实验目的: 本次实验以恢复drop操作为例,使用不同方法进行误操作的数据恢复. 方法: 利用master同步(本文)] 伪master+Binlog+同 ...

  2. centos系统中perl进程病毒占用大量网络流量导致网络瘫痪的问题分析及解决方案

    故障现象: 1.系统在早上9点的时候非常慢,单台服务器占用流量很大,使交换机流量被占满,而连累挂在同一交换机上的其他应用也无法提供服务,或者速度非常慢     2.通过查看进程发现大量的perl程序占 ...

  3. tomcat6和tomcat7管理用户manager配置

    tomcat用户登录文件配置 如果想要对部署在tomcat上的项目进行管理查看,需要在tomcat安装目录conf文件夹下的tomcat-user.xml里添加用户登录权限.具体添加的内容如下: To ...

  4. python文件、文件夹操作OS模块

    转自:python文件.文件夹操作OS模块   '''一.python中对文件.文件夹操作时经常用到的os模块和shutil模块常用方法.1.得到当前工作目录,即当前Python脚本工作的目录路径: ...

  5. 【5分钟一个知识点】JS一文搞懂new操作符

    关于new操作符,看了两本书<Javascript高级程序设计3>和<你不知道的JS上>,以及其他文档后,终于豁然开朗. 现总结如下,希望同样懵逼的你,彻底理解它. 如果有不同 ...

  6. 详解用webpack的CommonsChunkPlugin提取公共代码的3种方式(注意webpack4.0版本已不存在)

    Webpack 的 CommonsChunkPlugin 插件,负责将多次被使用的 JS 模块打包在一起. CommonsChunkPlugin 能解决的问题 在使用插件前,考虑几个问题: 对哪些 c ...

  7. Spring IOC 低级容器解析

    1.IOC是什么 IOC-Inversion of Control,即"控制反转",不是什么技术,而是一种设计思想.在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不 ...

  8. 性能测试十六:liunx下jmete配置环境变量

    修改环境变量后就不用每次手动输入路径,省时省事,减少命令长度和出错率 按Ctrl+L可进行翻页,翻页到最后一行,此处有java的环境变量 添加jmeter的目录和bin目录 此时,虽修改成功,但是并未 ...

  9. python接口自动化测试二十六:使用pymysql模块链接数据库

     #!/usr/bin/env python# -*- coding: utf-8 -*-# @Time    : 2018/5/28 18:51# @Author  : StalloneYang#  ...

  10. python 全栈开发,Day79(Django的用户认证组件,分页器)

    一.Django的用户认证组件 用户认证 auth模块 在进行用户登陆验证的时候,如果是自己写代码,就必须要先查询数据库,看用户输入的用户名是否存在于数据库中: 如果用户存在于数据库中,然后再验证用户 ...