CF1106F Lunar New Year and a Recursive Sequence 原根、矩阵快速幂、BSGS
好久没写数论题了写一次调了1h
首先发现递推式是一个乘方的形式,线性递推和矩阵快速幂似乎都做不了,那么是否能够把乘方运算变成加法运算和乘法运算呢?
使用原根!学过\(NTT\)的都知道\(998244353\)的原根\(G=3\)。
使用原根之后,可以得到一个等价的新递推式:\(G^{g_i} = \prod\limits _ {j=1}^k G^{g_{i - j} \times b_j} \mod 998244353(G^{g_i} \equiv f_i\mod 998244353)\),它等价于\(g_i = \sum\limits_{j=1}^k g_{i-j} \times b_j \mod 998244352\)。这样就可以矩阵快速幂得出当\(f_k\)等于某个值\(G^p\)时\(f_n\)的值了。
可现在知道的是\(f_n\)的值,不知道\(f_k\)的值。
考虑:令\(G_k=1\),得到\(G_n\)的值\(x\),那么可以知道\(f_k^x \equiv f_n \mod 998244353\)。
这是一个模意义下的高次剩余方程,要怎么求解呢?
同样使用原根。设\(f_{k} = G^b \mod 998244353\),通过\(BSGS\)求出\(f_n = G^y \mod 998244353\),那么原式变成\(G^{bx} \equiv G^y \mod 998244353\),即\(bx \equiv y \mod 998244352\)。逆元求解方程得到\(b\),也就得到了\(f_k\)。
一些打比赛时被坑到的点:
①\(998244352 = 2^{23} \times 7 \times 17\),求逆元要用欧拉定理或者拓展欧几里得
②\(998244351 \times 998244351 \times 100 > 2^{63}\),这意味着矩阵相乘不能算完再一起取模
#include<bits/stdc++.h>
#define int long long
//This code is written by Itst
using namespace std;
inline int read(){
int a = 0;
char c = getchar();
bool f = 0;
while(!isdigit(c)){
if(c == '-')
f = 1;
c = getchar();
}
while(isdigit(c)){
a = (a << 3) + (a << 1) + (c ^ '0');
c = getchar();
}
return f ? -a : a;
}
const int MOD = 998244353 , G = 3;
int K;
struct matrix{
int a[100][100];
int* operator [](int x){return a[x];}
matrix(){memset(a , 0 , sizeof(a));}
matrix operator *(matrix b){
matrix c;
for(int i = 0 ; i < K ; ++i)
for(int j = 0 ; j < K ; ++j)
for(int k = 0 ; k < K ; ++k)
c[i][j] = (c[i][j] + a[i][k] * b[k][j]) % (MOD - 1);
return c;
}
}S , T;
inline int gcd(int a , int b){
int r = a % b;
while(r){
a = b;
b = r;
r = a % b;
}
return b;
}
inline int poww(int a , int b , int mod = MOD){
int times = 1;
while(b){
if(b & 1)
times = times * a % mod;
a = a * a % mod;
b >>= 1;
}
return times;
}
map < int , int > Hash;
inline int BSGS(int x){
int t = sqrt(MOD) + 1 , times = x;
for(int i = 0 ; i < t ; i++){
Hash[times] = i;
times = times * G % MOD;
}
times = poww(G , t);
int now = times;
for(int i = 1 ; i <= t + 1 ; i++){
if(Hash.count(now)){
return i * t - Hash[now];
}
now = now * times % MOD;
}
return -1;
}
int phi(int x){
int times = x;
for(int i = 2 ; i * i <= x ; ++i){
if(x % i == 0){
times = times / i * (i - 1);
while(x % i == 0)
x /= i;
}
}
if(x - 1)
times = times / x * (x - 1);
return times;
}
signed main(){
#ifndef ONLINE_JUDGE
//freopen("in" , "r" , stdin);
//freopen("out" , "w" , stdout);
#endif
K = read();
for(int i = 0 ; i < K ; ++i)
T[K - i - 1][K - 1] = read() % (MOD - 1);
int N = read() - K;
int t = BSGS(read());
for(int i = 0 ; i + 1 < K ; ++i)
T[i + 1][i] = 1;
S[0][K - 1] = 1;
while(N){
if(N & 1)
S = S * T;
T = T * T;
N >>= 1;
}
int cur = S[0][K - 1] , p = gcd(cur , MOD - 1);
if(t % p != 0)
puts("-1");
else{
t /= p;
cur /= p;
int mod = (MOD - 1) / p;
cout << poww(G , poww(cur , phi(mod) - 1 , mod) * t % mod);
}
return 0;
}
CF1106F Lunar New Year and a Recursive Sequence 原根、矩阵快速幂、BSGS的更多相关文章
- CF1106F Lunar New Year and a Recursive Sequence(矩阵快速幂+bsgs+exgcd)
题面 传送门 前置芝士 \(BSGS\) 什么?你不会\(BSGS\)?百度啊 原根 对于素数\(p\)和自然数\(a\),如果满足\(a^x\equiv 1\pmod{p}\)的最小的\(x\)为\ ...
- HDU 5950 Recursive sequence(矩阵快速幂)
题目链接:Recursive sequence 题意:给出前两项和递推式,求第n项的值. 题解:递推式为:$F[i]=F[i-1]+2*f[i-2]+i^4$ 主要问题是$i^4$处理,容易想到用矩阵 ...
- Recursive sequence (矩阵快速幂)2016ACM/ICPC亚洲区沈阳站
题目 Farmer John likes to play mathematics games with his N cows. Recently, they are attracted by recu ...
- HDU 5950:Recursive sequence(矩阵快速幂)
http://acm.hdu.edu.cn/showproblem.php?pid=5950 题意:给出 a,b,n,递推出 f(n) = f(n-1) + f(n-2) * 2 + n ^ 4. f ...
- 【HDU5950】Recursive sequence(矩阵快速幂)
BUPT2017 wintertraining(15) #6F 题意 \(f(1)=a,f(2)=b,f(i)=2*(f(i-2)+f(i-1)+i^4)\) 给定n,a,b ,\(N,a,b < ...
- HDU 5950 Recursive sequence(矩阵快速幂)题解
思路:一开始不会n^4的推导,原来是要找n和n-1的关系,这道题的MOD是long long 的,矩阵具体如下所示 最近自己总是很坑啊,代码都瞎吉坝写,一个long long的输入写成%d一直判我TL ...
- 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 ...
- A - Number Sequence(矩阵快速幂或者找周期)
Description A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * ...
- HDU 5667 Sequence(矩阵快速幂)
Problem Description Holion August will eat every thing he has found. Now there are many foods,but he ...
随机推荐
- JavaScript与正则表达式
正则表达式的定义 正则表达式与字符串对象相关的方法 相关示例 一.正则表达式(regular expression简称res) 1.定义: 一个正则表达式就是由普通字符以及特殊字符(称为元字符)组成 ...
- 我的第一个个人博客网站 -> wizzie.top
从去年下半年实习结束,到找到第一个属于自己的工作,我就开始着手搭建自己的网站. 使用阿里云学生服务器,域名,备案解析后,开始设计网站结构和页面布局. 因为临近毕业,网站真的是写的页面怎么多怎么写,所以 ...
- Spark性能优化(基于Spark 1.x)
Task优化: 1.慢任务的性能优化:可以考虑减少每个Partition处理的数据量,同时建议开启spark.speculation(慢任务推导,当检测的慢任务时,会同步开启相同的新任务,谁先完 ...
- 洗礼灵魂,修炼python(45)--巩固篇—【转载】类的__now__和__init__
学到这里了,相信你应该对__init__非常熟悉了,就是构造器呗,当类被实例化时初始化的作用 但__init__其实不是实例化一个类的时候第一个自动调用的方法.当实例化一个类时,最先被调用的方法 其实 ...
- MySQL8.0——Resource Group(资源组)
资源组介绍 简介 MySQL是单进程多线程的程序,MySQL线程包括后台线程(Master Thread.IO Thread.Purge Thread等),以及用户线程.在8.0之前,所有线程的优先级 ...
- 常用css字体英文写法
font-family: 'Microsoft Yahei',sans-serif; 宋体:SimSun 黑体:SimHei
- 第四章 Hyper-V 2012 R2 网络配置
尼玛的我不高兴写了,所以下面的文档我直接把原来的pdf给转换出来,加了点自己的注解,我写的话会写自己觉得终于的章节. 在搭建虚拟化平台时,网络的虚拟化是一个非常重要的环节,如何保障网络的持续可用并 ...
- WampServer 安装使用详解
WampServer集成环境的搭建.安装.使用.配置 什么是WampServer WampServer是一款由法国人开发的Apache Web服务器.PHP解释器以及MySQL数据库的整合软件包.免去 ...
- 3.3Python数据处理篇之Numpy系列(三)---数组的索引与切片
目录 (一)数组的索引与切片 1.说明: 2.实例: (二)多维数组的索引与切片 1.说明: 2.实例: 目录: 1.一维数组的索引与切片 2.多维数组的索引与切片 (一)数组的索引与切片 1.说明: ...
- Python3编写网络爬虫04-爬取猫眼电影排行实例
利用requests库和正则表达式 抓取猫眼电影TOP100 (requests比urllib使用更方便,由于没有学习HTML系统解析库 选用re) 1.目标 抓取电影名称 时间 评分 图片等 url ...