文章目录

  • 题意
  • 题解
    • 对数法转指数线性递推
    • 原根与模意义下求对数
    • 拔山盖世!
    • 最终步骤

Problem Origin
狠搞了一个多星期,做出来之后仍然一知半解,写个博客重理思路.

题意

定义序列fff满足以下的递推关系式:
fi=(∏j=1kfi−jbj)modpf_i= (\prod ^k _{j=1} f^{bj} _{i-j}) mod \ pfi​=(j=1∏k​fi−jbj​)mod p
其中p=998244353p=998244353p=998244353.
已知fff的前k−1k-1k−1项都为111,给定序列bbb,求是否存在一个fkf_kfk​使得fn=mf_n=mfn​=m.

题解

这个题需要相当多前置知识.

对数法转指数线性递推

递推式两边同时取333的对数.为什么要取333的对数而不是别的数的对数?待会说.
接下来利用对数的性质拆开化积成和.
log3fi=b1log3fi−1+b2log3fi−2+...+bklog3fi−k(modp)log_3f_i= b_1log_3 f_{i-1} +b_2log_3f_{i-2} +...+b_klog_3f_{i-k}(mod \ p)log3​fi​=b1​log3​fi−1​+b2​log3​fi−2​+...+bk​log3​fi−k​(mod p)
令hx=log3(fx)h_x=log_3(f_x)hx​=log3​(fx​),则
hi=b1hi−1+b2hi−2+...+bkhi−k(modp−1)h_i=b_1h_{i-1}+b_2h_{i-2}+...+b_kh_{i-k}(mod \ p-1)hi​=b1​hi−1​+b2​hi−2​+...+bk​hi−k​(mod p−1)
显然序列hhh可以通过矩阵快速幂递推.
指数递推的情况,显然使用欧拉降幂的第一条,对p−1p-1p−1进行取模.
而由于f1→k−1=1f_{1\to k-1}=1f1→k−1​=1,h1→k−1=0h_{1\to k-1} = 0h1→k−1​=0,利用矩阵

b1 b2 b3 ... bn
1  0  0  ... 0  0
0  1  0  ... 0  0
0  0  1  ... 0  0
... ... ... ...
0  0  0  ..  1  0

求出n−kn-kn−k次幂可以完成hhh序列的递推.
此时我们发现矩阵MMM满足fkM[1][1]=m(modp)f_k^{M[1][1]}=m(mod \ p)fkM[1][1]​=m(mod p).
左右对333取对数得M[1][1]hk=log3m(modp−1)M[1][1]h_k=log_3m (mod \ p-1)M[1][1]hk​=log3​m(mod p−1)
接下来进入第二个前置知识.

原根与模意义下求对数

一般的题目都是对一个大质数取模,当前我们仅考虑模ppp意义下的情况,其中ppp是个质数.
假设存在正整数ggg,当xxx取遍0→p−10\to p-10→p−1全部正整数时,满足gxmodpg^x mod \ pgxmod p能将0→p−10 \to p-10→p−1的每一个数全部取一遍,这样的ggg称作ppp的一个原根.
本题只需要这个定义,关于阶与原根的知识请参考无敌的oiwiki.
这样我们就能够保证对于任何x∈[0,p−1]x\in[0,p-1]x∈[0,p−1],loggxlog_gxlogg​x的结果都不同,也即以ggg为底的对数不同.
尝试发现g=3g=3g=3是模数p=998244353p=998244353p=998244353的一个原根,因此本题取对数的时候以333为底.

拔山盖世!

BSGS全称Baby Step Giant Step,又称拔山盖世.
拔山盖世法可以在p\sqrt{p}p​时间内求出ax≡ba^x \equiv bax≡b的一个xxx.
方法如下:
令x=kp+r(r<p)x=k\sqrt{p}+r(r<\sqrt{p})x=kp​+r(r<p​),则枚举rrr,用map或者哈希表存储所有armodpa^r mod\ parmod p的值,再枚举kkk,寻找是否有xkp≡b×inv(xr)x^{k\sqrt{p}} \equiv b\times inv(x^r)xkp​≡b×inv(xr),可以使用扩展欧几里得进行判断.大功告成.

最终步骤

第一步我们得到M[1][1]hk=log3m(modp−1)M[1][1]h_k=log_3m (mod \ p-1)M[1][1]hk​=log3​m(mod p−1)
用拔山盖世求出log3mlog_3mlog3​m的值zzz,最终本题变为一道扩展欧几里得,排除掉不存在解的情况,求出hkh_khk​,用快速幂可以得到答案.

#include<bits/stdc++.h> //Ithea Myse Valgulious
namespace chtholly{typedef long long ll;
#define re0 register int
#define rel register ll
#define rec register char
#define gc getchar
//#define gc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<23,stdin),p1==p2)?-1:*p1++)
#define pc putchar
#define p32 pc(' ')
#define pl puts("")
/*By Citrus*/
char buf[1<<23],*p1=buf,*p2=buf;
inline int read(){int x=0,f=1;char c=gc();for (;!isdigit(c);c=gc()) f^=c=='-';for (;isdigit(c);c=gc()) x=(x<<3)+(x<<1)+(c^'0');return f?x:-x;}
template <typename mitsuha>
inline bool read(mitsuha &x){x=0;int f=1;char c=gc();for (;!isdigit(c)&&~c;c=gc()) f^=c=='-';if (!~c) return 0;for (;isdigit(c);c=gc()) x=(x<<3)+(x<<1)+(c^'0');return x=f?x:-x,1;}
template <typename mitsuha>
inline int write(mitsuha x){if (!x) return 0&pc(48);if (x<0) pc('-'),x=-x;int bit[20],i,p=0;for (;x;x/=10) bit[++p]=x%10;for (i=p;i;--i) pc(bit[i]+48);return 0;}
inline char fuhao(){char c=gc();for (;isspace(c);c=gc());return c;}
}using namespace chtholly;
using namespace std;
const int _=205,mod=998244353;
ll kasumi(ll a,ll b=mod-2) {ll zw=1;for (;b;b>>=1,a=a*a%mod) if (b&1) zw=zw*a%mod;return zw;
}
ll bsgs(ll a,ll b) {ll m=sqrt(mod)+1,i,now=1,stp;unordered_map<ll,ll> tab;for (ll i=0;i<m;++i) {ll tmp=b*kasumi(now)%mod;if (!tab.count(tmp)) tab[tmp]=i;now=now*a%mod;} stp=now,now=1;for (ll i=0;i<mod;i+=m) {if (tab.count(now)) return i+tab[now];now=now*stp%mod;}return -1;
}
ll exgcd(ll a,ll b,ll &x,ll &y) {if (!b) return x=1,y=0,a;ll gcd=exgcd(b,a%b,y,x);return y-=a/b*x,gcd;
}
struct juzhen{ll a[_][_],k;juzhen() {k=0,memset(a,0,sizeof a);}juzhen(ll n,ll d) {memset(a,0,sizeof a); // 就是这句没有加,我一个星期就这么没了!k=n; for (ll i=1;i<=k;++i) a[i][i]=d;}juzhen operator *(const juzhen &b) const {juzhen ans=juzhen(k,0);for (int l=1;l<=k;++l) {for (int j=1;j<=k;++j) {for (int i=1;i<=k;++i) ans.a[i][j]=(ans.a[i][j]+a[i][l]*b.a[l][j])%(mod-1);}}return ans;}juzhen operator ^(ll b) {juzhen zw(k,1);for (;b;b>>=1,*this=*this**this) if (b&1) zw=zw**this;return zw;}
}f,g;
ll solve(ll a,ll b,ll c) {if (!c) return 0;ll q=__gcd(a,b),x,y;if (c%q) return -1;a/=q,b/=q,c/=q;exgcd(a,b,x,y);x=x*c%b;for (;x<0;x+=b);return x;
}
int main() {ll i,k=read(),n,p; g=juzhen(k,0);for (i=1;i<k;++i) g.a[1][i]=read()%(mod-1),g.a[i+1][i]=1;g.a[1][k]=read();read(n),read(p);g=g^(n-k); ll zw=solve(g.a[1][1],mod-1,bsgs(3,p));printf("%lld\n",~zw?kasumi(3,zw):-1);
}

本题终于结束了.这是一道非常纷繁复杂的题,可能是我做过最难的2400.我因为矩阵初始化没有清零耗了一星期,把我搞得自闭了.

Codeforces 1106F Lunar New Year and a Recursive Sequence 矩阵快速幂,原根转化模意义下对数,BSGS相关推荐

  1. Codeforces 1106F Lunar New Year and a Recursive Sequence (数学、线性代数、线性递推、数论、BSGS、扩展欧几里得算法)...

    Codeforces 1106F Lunar New Year and a Recursive Sequence (数学.线性代数.线性递推.数论.BSGS.扩展欧几里得算法) 哎呀大水题..我写了一 ...

  2. Codeforces 1106F Lunar New Year and a Recursive Sequence (线性代数、线性递推、数论、BSGS、扩展欧几里得算法)...

    哎呀大水题..我写了一个多小时..好没救啊.. 数论板子X合一? 注意: 本文中变量名称区分大小写. 题意: 给一个\(n\)阶递推序列\(f_k=\prod^{n}_{i=1} f_{k-i}^{b ...

  3. @codeforces - 1106F@ Lunar New Year and a Recursive Sequence

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 定义递推数列 f: (1)f[1] = f[2] = ... f ...

  4. Recursive sequence(矩阵快速幂)

    这就是矩阵的魅力吗,爱了爱了 题 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<iostream> #i ...

  5. CodeForces 392C Yet Another Number Sequence 矩阵快速幂

    题意: \(F_n\)为斐波那契数列,\(F_1=1,F_2=2\). 给定一个\(k\),定义数列\(A_i=F_i \cdot i^k\). 求\(A_1+A_2+ \cdots + A_n\). ...

  6. 数论练习二之BSGS算法——随机数生成器,Matrix,Lunar New Year and a Recursive Sequence,Fermat‘s Last Theorem

    [SDOI2013] 随机数生成器 description solution 肯定是非常想找一个通项公式来表示第nnn个数的 依据形式,考虑化成等比数列 xi+1+k=a(xi+k)=a⋅xi+b+t ...

  7. HDU 5950 Recursive sequence(矩阵快速幂)

    题目链接:Recursive sequence 题意:给出前两项和递推式,求第n项的值. 题解:递推式为:$F[i]=F[i-1]+2*f[i-2]+i^4$ 主要问题是$i^4$处理,容易想到用矩阵 ...

  8. 【Codeforces Gym - 101635C Macarons 】【矩阵快速幂+状压】【dfs时间换空间】

    [链接] http://codeforces.com/gym/101635/attachments [题意] 求用1*1,1*2的方格填n*m的矩阵的方法数 [知识点] 状压dfs+矩阵快速幂 [分析 ...

  9. Codeforces 621E Wet Shark and Block【dp + 矩阵快速幂】

    题意: 有b个blocks,每个blocks都有n个相同的0~9的数字,如果从第一个block选1,从第二个block选2,那么就构成12,问对于给定的n,b有多少种构成方案使最后模x的余数为k. 分 ...

最新文章

  1. 2020牛客多校G[并查集的两种思想,按秩合并+路径压缩]
  2. linux下实现dns服务器,linux下DNS服务器的实现1
  3. Vue实现仿音乐播放器4-Vue-router实现音乐导航菜单切换
  4. dr优先级默认_OSPF中的DR/BDR的选取规则:DR优先级,Router ID
  5. 微服务架构学习 之 什么是微服务
  6. leetcode最长无重复子串384题
  7. [java]ArrayList的介绍
  8. c语言开发一个翻译算法,使用有道翻译API做翻译(c语言实现)
  9. android百度云和谐,视频总被百度云和谐?这个小工具帮你完美解决
  10. linux下挂载F2FS文件系统
  11. 进入浏览器下载文件,状态栏不显示下载图标
  12. visio绘制网络拓扑图要求_必备!可以电脑在线使用的3款网络拓扑图软件安利
  13. 详细安装Adobe Dreamweaver教程和制作第一个网页
  14. 大学英语综合教程一 Unit 8 课文内容英译中 中英翻译
  15. 智慧城市是什么,建设智慧城市需要哪些核心技术?
  16. 我怀疑京东神秘部门Y,悟出智能供应链真相了
  17. int、tinyint、bigint的区别/MySQL中
  18. 1.MATLAB图像处理基础知识
  19. maven环境配好了,执行mvn -v命令,提示mvn不是内部或外部命令
  20. CES Aisa总结篇|盛况依旧,却始终缺了点新意和真实落地的感觉

热门文章

  1. sas和python哪个更容易发胖_碳水化合物和脂肪哪个更容易让身体发胖?
  2. Windows10的pin码有几位
  3. 活着活着,就明白了(精辟)
  4. python调用短信宝API发送短信(附python代码 易理解)
  5. 基于物理的渲染—更精确的微表面分布函数GGX
  6. 讯飞智能录音笔SR502内存升级,实力更强大
  7. 高通thermal-engine配置文件格式详解
  8. 派克液压泵电控比例放大器
  9. java内存溢出监控_Java内存溢出和死锁的监控与分析
  10. windows上安装linux_Linux系统安装Windows软件? 通过这个工具可以做到