题目链接:CF1106F Lunar New Year and a Recursive Sequence

大意:已知\(f_1,f_2,\cdots,f_{k-1}\)和\(b_1,b_2,\cdots,b_k\),且有递推关系

\[f_i=(\prod_{j=1}^kf_{i-j}^{b_j})\text%p
\]

对于所有\(i>k\)均成立,给出\(f_n=m\),求\(f_k\),\(p=998244353\)

分析:

数论板子大集合

首先很显然有\(f_n=f_k^{q}\),于是考虑先求出这个\(q\)

看到\(k\leq100\)一般就会想到矩阵乘法之类的

但是这个式子的\(b\)处在乘方的位置,无法直接使用矩阵

注意到模数为998244353,其原根为3

那么我们就可以使用原根来改写这个转移

\[g_i=\prod_{j=1}^kg_{i-j}b_j
\]

这个是可以利用矩阵乘法的,初值\(g_i=0(i<k),g_k=1\)

我们于是可以利用矩乘找到这样的关系式:\(f_k^{q}\equiv f_n(mod\ p),q=g_n\)

这个玩意似乎可以类比的被定义为k次剩余,不过我们显然不会这个玩意

于是我们继续使用原根

我们知道\(f_n\)可以被写作\(3^t\),那么我们设\(f_k\)可以被写作为\(3^x\)

那么我们就是求满足这个式子的x值:\(3^{xq}\equiv3^t(mod\ p)\)

那么对于指数我们可以直接用exgcd,因为此时有\(xq\equiv t(mod\ p-1)\)

将m转为\(3^t\)时可以使用BSGS

问题就得到了解决QAQ

注意模数会在\(p-1\)和\(p\)之间切换,指数的模数为\(p-1\)(包括上面的矩乘),而在BSGS中的模数则为\(p\)

#include<iostream>
#include<string.h>
#include<string>
#include<stdio.h>
#include<algorithm>
#include<math.h>
#include<vector>
#include<queue>
#include<map>
using namespace std;
#define int long long
const int maxd=998244353,N=100000;
const double pi=acos(-1.0);
typedef long long ll;
int n,K,b[120],m; struct matrix{
ll x[120][120];
}ans,sum; matrix operator *(matrix a,matrix b)
{
matrix c;
memset(c.x,0,sizeof(c.x));
int i,j,k;
for (i=0;i<K;i++)
{
for (j=0;j<K;j++)
{
for (k=0;k<K;k++)
{
c.x[i][j]=(c.x[i][j]+a.x[i][k]*b.x[k][j])%(maxd-1);
}
}
}
return c;
} void qpow(int tim)
{
while (tim)
{
int tmp=tim&1;tim/=2;
if (tmp) ans=ans*sum;
sum=sum*sum;
}
} ll qpow(ll x,ll y)
{
ll ans=1,sum=x;
while (y)
{
int tmp=y&1;y/=2;
if (tmp) ans=(ans*sum)%maxd;
sum=(sum*sum)%maxd;
}
return ans;
} map<ll,ll> mp;
ll bsgs(int a,int b)
{
int siz=sqrt(maxd-1)+1,i;ll sum=b;
for (i=0;i<=siz;i++)
{
mp[sum]=i;
sum=(sum*a)%maxd;
}
ll tmp=qpow(a,siz);sum=1;
for (i=1;i<=siz;i++)
{
sum=(sum*tmp)%maxd;
if (mp[sum]) return i*siz-mp[sum];
}
} ll gcd(ll x,ll y)
{
if (!y) return x; else return gcd(y,x%y);
} void exgcd(ll a,ll b,ll &g,ll &x,ll &y)
{
if (!b) {x=1;y=0;g=a;return;}
else
{
ll tmpx,tmpy;
exgcd(b,a%b,g,tmpx,tmpy);
x=tmpy;y=tmpx-a/b*tmpy;
}
} int read()
{
int x=0,f=1;char ch=getchar();
while ((ch<'0') || (ch>'9')) {if (ch=='-') f=-1;ch=getchar();}
while ((ch>='0') && (ch<='9')) {x=x*10+(ch-'0');ch=getchar();}
return x*f;
} signed main()
{
K=read();
int i,j;
for (i=0;i<K;i++) {ans.x[i][i]=1;sum.x[0][i]=read();}
for (i=0;i<K-1;i++) sum.x[i+1][i]=1;
ans.x[0][0]=1;
n=read();m=read();
qpow(n-K);
ll q=ans.x[0][0],p=bsgs(3,m);
//cout << q << " " << p << endl;
ll tmp=gcd(q,maxd-1);
if (p%tmp) {printf("-1");return 0;}
ll x,y,g;
exgcd(q,maxd-1,g,x,y);
x=(p/g*x)%(maxd-1);
if (x<0) x+=(maxd-1);
printf("%lld",qpow(3,x));
return 0;
}
/*
3
2 3 5
4 16
*/

CF1106F Lunar New Year and a Recursive Sequence的更多相关文章

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

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

  2. CF1106F Lunar New Year and a Recursive Sequence 线性递推 + k次剩余

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

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

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

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

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

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

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

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

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

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

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

  8. hdu 5950 Recursive sequence 矩阵快速幂

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

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

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

随机推荐

  1. 避免使用HttpClient的系统代理

    这两天在玩Consul, 他的.Net驱动使用了HttpClient来发送Http请求. 但是我的电脑上装有SS, 所以请求会被SS过滤一次, 然后导致请求的延迟一直比较高. 然后只需要改写一下Htt ...

  2. vue及Eelement使用过程中遇到的一些问题

    在做项目的过程中,目前主要遇到了以下几个问题: 一.样式问题 1.样式中使用scoped的问题: 主要表现在从一个页面跳到另一个页面时,第二个页面的样式不能正确显示,通过刷新才能恢复页面的预定样式. ...

  3. HDU 3478 Catch (连通性&&二分图判断)

    链接 [https://vjudge.net/contest/281085#problem/C] 题意 一个n个点,m条边的图,开始的点是s 每次必须移动到相邻的位置,问你是否存在某个时刻所有点都可能 ...

  4. LookupError: Resource averaged_perceptron_tagger not found. Please use the NLTK Downloader to obtain the resource:

    命令行执行 import nltk nltk.download('averaged_perceptron_tagger') 完事

  5. Day7 Ubantu学习(一)

    Linux是多用户操作系统 Ubantu学习参考网址:https://www.cnblogs.com/resn/p/5800922.html 1.虚拟机网络类型的理解 bridged(桥接模式) : ...

  6. freemarker根据模板生成word文件实现导出功能

    一.准备工作 1.创建一个03的word文档,动态的数据用占位符标志占位(如testname).然后另存为word2003的xml文件. 2.格式化xml文件,占位符的位置用${testname}代替 ...

  7. C#复习笔记(2)--C#1所搭建的核心基础

    通过对C#1所搭建的核心基础的深入了解,可以知道之后的C#版本在C#1的基础上做了很多扩展,而这些扩展都是基于C#搭建的核心基础而来的. 委托 一.编写委托的过程 委托经常和C语言的“函数指针”挂钩. ...

  8. Bootstrap知识记录:表格和按钮

    基本格式.table3.带边框的表格//给表格增加边框<table class="table table-bordered">4.悬停鼠标//让<tbody> ...

  9. java随笔5 完整路径的应用

    不仅类,函数,甚至参数都可以获取完整路径

  10. Java8 Hash改进/内存改进

    又开新坑o(*≧▽≦)ツ讲讲几个Java版本的特性,先开始Java8, HashMap的改进 HashMap采用哈希算法,先使用hashCode()判断哈希值是否相同,如果相同,再使用equals() ...