已知\(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})\)


  1. #include <map>
  2. #include <queue>
  3. #include <cmath>
  4. #include <cstdio>
  5. #include <cstring>
  6. #include <iostream>
  7. #include <algorithm>
  8. using namespace std;
  9. #define de double
  10. #define ll long long
  11. #define ri register int
  12. #define rep(io, st, ed) for(ri io = st; io <= ed; io ++)
  13. #define drep(io, ed, st) for(ri io = ed; io >= st; io --)
  14. #define gc getchar
  15. inline int read() {
  16. int p = 0, w = 1; char c = gc();
  17. while(c > '9' || c < '0') { if(c == '-') w = -1; c = gc(); }
  18. while(c >= '0' && c <= '9') p = p * 10 + c - '0', c = gc();
  19. return p * w;
  20. }
  21. const int sid = 105;
  22. const int mod = 998244353;
  23. const int g = 3;
  24. inline int mul(int a, int b) { return 1ll * a * b % mod; }
  25. inline int fp(int a, int k) {
  26. int ret = 1;
  27. for( ; k; k >>= 1, a = mul(a, a))
  28. if(k & 1) ret = mul(ret, a);
  29. return ret;
  30. }
  31. int n, m, k, b[sid];
  32. struct mtx {
  33. int f[sid][sid];
  34. mtx() {}
  35. mtx(int flag) {
  36. if(flag == 0) {
  37. for(int i = 0; i < k; i ++)
  38. for(int j = 0; j < k; j ++)
  39. f[i][j] = 0;
  40. }
  41. if(flag == 1) {
  42. for(int i = 0; i < k; i ++)
  43. for(int j = 0; j < k; j ++)
  44. f[i][j] = (i == j) ? 1 : 0;
  45. }
  46. }
  47. int* operator [] (const int x) {
  48. return f[x];
  49. }
  50. friend mtx operator * (mtx a, mtx b) {
  51. mtx c(0);
  52. for(int i = 0; i < k; i ++)
  53. for(int j = 0; j < k; j ++)
  54. for(int p = 0; p < k; p ++)
  55. c[i][j] = (c[i][j] + 1ll * a[i][p] * b[p][j] % (mod - 1)) % (mod - 1);
  56. return c;
  57. }
  58. } A, B;
  59. inline mtx fp(mtx a, int k) {
  60. mtx ret(1);
  61. for( ; k; k >>= 1, a = a * a)
  62. if(k & 1) ret = ret * a;
  63. return ret;
  64. }
  65. map <int, int> H;
  66. inline int BSGS(int A, int B) {
  67. H.clear(); H[1] = 0;
  68. int Ai = 1, Aj = 1, m = ceil(sqrt(mod));
  69. for(ri i = 1; i < m; i ++) Ai = 1ll * Ai * A % mod, H[1ll * Ai * B % mod] = i;
  70. Ai = 1ll * Ai * A % mod;
  71. for(ri i = 1; i <= m; i ++) {
  72. Aj = 1ll * Aj * Ai % mod;
  73. if(H[Aj]) return 1ll * i * m - H[Aj];
  74. }
  75. }
  76. inline int gcd(int a, int b) {
  77. return b ? gcd(b, a % b) : a;
  78. }
  79. inline void exgcd(int &x, int &y, int a, int b) {
  80. if(!b) { x = 1; y = 0; return; }
  81. exgcd(y, x, b, a % b); y -= a / b * x;
  82. }
  83. inline void Solve() {
  84. A[0][k - 1] = 1;
  85. rep (i, 0, k - 1) B[i][k - 1] = b[k - i];
  86. rep (i, 0, k - 2) B[i + 1][i] = 1;
  87. A = A * fp(B, n - k);
  88. int p = A[0][k - 1], t = BSGS(g, m);
  89. if(t % gcd(p, mod - 1)) printf("-1\n");
  90. else {
  91. int gd = gcd(p, mod - 1);
  92. int x, y, a = p, b = mod - 1;
  93. t /= gd; a /= gd; b /= gd;
  94. exgcd(x, y, a, b);
  95. x = (x + mod - 1) % (mod - 1);
  96. x = 1ll * x * t % (mod - 1);
  97. printf("%d\n", fp(g, x));
  98. }
  99. }
  100. int main() {
  101. k = read();
  102. rep(i, 1, k) b[i] = read();
  103. n = read(); m = read();
  104. Solve();
  105. return 0;
  106. }

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. Netty通信原理

    Netty是一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端,它极大的简化了TCP和UDP套接字服务器等网络编程. BIO(Blocking IO):每一个请求,一个S ...

  2. 搭建Modelsim SE仿真环境-使用do文件仿真

    本章我们介绍仿真环境搭建是基于Modelsim SE的.Modelsim有很多版本,比如说Modelsim-Altera,但是笔者还是建议大家使用Modelsim-SE,Modelsim-Altera ...

  3. 【Mysql sql inject】【入门篇】sqli-labs使用 part 4【18-20】

    这几关的注入点产生位置大多在HTTP头位置处 常见的HTTP注入点产生位置为[Referer].[X-Forwarded-For].[Cookie].[X-Real-IP].[Accept-Langu ...

  4. AT91RM9200---定时器简介

    1.前言 系统定时器模块集成了3个不同的定时器 一个周期性间隔的定时器,用来为操作系统设置时基 一个看门狗定时器,可用于软件死锁时进行系统复位 一个实时时钟计数器用来记录流逝的时间 系统定时器时钟 这 ...

  5. ARMV8 datasheet学习笔记4:AArch64系统级体系结构之VMSA

    1. 前言 2. VMSA概述 2.1 ARMv8 VMSA naming VMSAv8 整个转换机中,地址转换有一个或两个stage VMSAv8-32 由运行AArch32的异常级别来管理 VMS ...

  6. cmake 使用

    1.cmake 显示编译命令: 在顶层CMakeLists.txt里设置 set(CMAKE_VERBOSE_MAKEFILE ON) 或者  cmake .        再           m ...

  7. Log4Net 无法写入到SqlServer

    直接进入正题: 今天在测试使用Log4Net写入到数据库的时候,发现一直无法写入到数据库中,而且程式也没有报任何错误. 配置信息如下: <appender name="AdoNetAp ...

  8. 读SRE Google运维解密有感(一)

    前言 这几天打算利用碎片时间读了一下"SRE Google运维解密"这本书,目前读了前几章,感觉收获颇多,结合自己的工作经历和书中的要点,写一些感悟和思考 SRE 有关SRE我就不 ...

  9. C# 文件拖放

    将控件的属性AllowDrop设置为true,然后添加DragDrop.DragEnter时间处理函数 private void FormMain_DragEnter(object sender, D ...

  10. JSON和JSONP详解

    什么是JSON JSON是一种基于文本的数据交换方式,或者叫做数据描述格式,你是否该选用他首先肯定要关注它所拥有的优点. JSON的优点: 1.基于纯文本,跨平台传递极其简单: 2.Javascrip ...