2019南昌网络赛H The Nth Item(二阶线性数列递推 + 广义斐波那契循环节 + 分段打表)题解
题意:
传送门
已知\(F(n)=3F(n-1)+2F(n-2) \mod 998244353,F(0)=0,F(1)=1\),给出初始的\(n_1\)和询问次数\(q\),设每一次的答案\(a_i=F(n_i)\),而\(n_{i+1}=n_i\oplus(a_i*a_i)\),求\(a_1\oplus a_2\dots\oplus a_q\)。
思路:
原式是一个二次常数递归式,我们可以求得它的通项为:
\]
经过二次剩余等乱七八糟的操作,我们能直接\(O(qlogn)\)得到答案,但是时间还是太多。
1:
然后有一个广义斐波那契数列的循环节,那么用\(unordered\_map\)记忆化一下。
2:
因为直接\(logn\)求一个\(F(n)\)会超时,那么使用分段打表把复杂度降到\(O(1)\)。由扩展欧拉定理可得,\(a^n\equiv a^{n\%\varphi(p)+\varphi(p)} \mod p\),那么公式中的指数上限降到\(2(mod -1)\)。然后我们打表出\(\sqrt{2(mod -1)}<5e4\)次幂的结果,那么只要小于\(5e4\)的幂次直接可得。然后打表打出\(0*5e4,1*5e4\dots5e4*5e4\)次幂的结果,那么对于大于\(5e4\)的幂次可以转化为\(a^{k*5e4}*a^c\)前后结论都已打表,那么也是\(O(1)\)即可求解。
代码:
//1
#include<map>
#include<set>
#include<queue>
#include<cmath>
#include<stack>
#include<ctime>
#include<vector>
#include<cstdio>
#include<string>
#include<cstring>
#include<sstream>
#include<iostream>
#include<algorithm>
#include<unordered_map>
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
const int maxn = 1e6 + 5;
const int MAXM = 3e6;
const ll MOD = 998244353;
const ull seed = 131;
const int INF = 0x3f3f3f3f;
const ll r1 = 262199973, r2 = 736044383, invs17 = 559329360;
unordered_map<ll, ll> st;
ll ppow(ll a, ll b){
ll ret = 1;
while(b){
if(b & 1) ret = ret * a % MOD;
a = a * a % MOD;
b >>= 1;
}
return ret;
}
ll solve(ll n){
if(st.count(n)) return st[n];
return st[n] = (ppow(r1, n) - ppow(r2, n) + MOD) % MOD * invs17 % MOD;
}
int main(){
st.clear();
int q;
ll n;
scanf("%d%lld", &q, &n);
ll ans = 0, tmp;
for(int i = 1; i <= q; i++){
tmp = solve(n);
ans ^= tmp;
n = n ^ (tmp * tmp);
}
printf("%lld\n", ans);
return 0;
}
//2
#include<map>
#include<set>
#include<queue>
#include<cmath>
#include<stack>
#include<ctime>
#include<vector>
#include<cstdio>
#include<string>
#include<cstring>
#include<sstream>
#include<iostream>
#include<algorithm>
#include<unordered_map>
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
const int maxn = 1e6 + 5;
const int MAXM = 3e6;
const ll MOD = 998244353;
const ull seed = 131;
const int INF = 0x3f3f3f3f;
const ll r1 = 262199973, r2 = 736044383, invs17 = 559329360;
int N = 5e4;
ll p1[50005], p2[50005], pp1[50005], pp2[50005];
ll ppow1(int b){
if(b <= N) return p1[b];
else return pp1[b / N] * p1[b % N] % MOD;
}
ll ppow2(int b){
if(b <= N) return p2[b];
else return pp2[b / N] * p2[b % N] % MOD;
}
ll solve(ll n){
n = n % (MOD - 1) + MOD - 1;
return (ppow1(n) - ppow2(n) + MOD) % MOD * invs17 % MOD;
}
void init(){
p1[0] = p2[0] = 1;
for(int i = 1; i <= N; i++){
p1[i] = p1[i - 1] * r1 % MOD;
p2[i] = p2[i - 1] * r2 % MOD;
}
pp1[0] = pp2[0] = 1;
for(int i = 1; i <= N; i++){
pp1[i] = pp1[i - 1] * p1[N] % MOD;
pp2[i] = pp2[i - 1] * p2[N] % MOD;
}
}
int main(){
int q;
ll n;
init();
scanf("%d%lld", &q, &n);
ll ans = 0, tmp;
for(int i = 1; i <= q; i++){
tmp = solve(n);
ans ^= tmp;
n = n ^ (tmp * tmp);
}
printf("%lld\n", ans);
return 0;
}
2019南昌网络赛H The Nth Item(二阶线性数列递推 + 广义斐波那契循环节 + 分段打表)题解的更多相关文章
- 2019南昌网络赛H The Nth Item(打表找询问循环节 or 分段打表)
https://nanti.jisuanke.com/t/41355 思路 从fib循环节入手,\(O(1e7log(1e9))\),tle 因为只需要输出所有询问亦或后的结果,所以考虑答案的循环节, ...
- 南昌网络赛 H The Nth Item
南昌网络赛The Nth Item 暴力快速幂+unordered_map记忆化 注意:记忆化不能写到快速幂求解函数里,不断调用函数会造成很大的时间浪费 #include<bits/stdc++ ...
- 2019牛客多校第五场 generator 1——广义斐波那契循环节&&矩阵快速幂
理论部分 二次剩余 在数论中,整数 $X$ 对整数 $p$ 的二次剩余是指 $X^2$ 除以 $p$ 的余数. 当存在某个 $X$,使得式子 $X^2 \equiv d(mod \ p)$ 成立时,称 ...
- 2019 南昌ICPC网络赛H The Nth Item
The Nth Iteam 题意:F(0)=1,F(1)=1,F(n)=3*F(n-1)+2*F(n-2) (n>=2) ,F(n) mod 998244353.给出Q跟N1,Ni=Ni-1^( ...
- 2019南昌网络赛I:Yukino With Subinterval(CDQ) (树状数组套主席树)
题意:询问区间有多少个连续的段,而且这段的颜色在[L,R]才算贡献,每段贡献是1. 有单点修改和区间查询. 思路:46min交了第一发树套树,T了. 稍加优化多交几次就过了. 不难想到,除了L这个点, ...
- 2019-ACM-ICPC-南昌区网络赛-H. The Nth Item-特征根法求通项公式+二次剩余+欧拉降幂
2019-ACM-ICPC-南昌区网络赛-H. The Nth Item-特征根法求通项公式+二次剩余+欧拉降幂 [Problem Description] 已知\(f(n)=3\cdot f(n ...
- ACM-ICPC 2019南昌网络赛I题 Yukino With Subinterval
ACM-ICPC 2019南昌网络赛I题 Yukino With Subinterval 题目大意:给一个长度为n,值域为[1, n]的序列{a},要求支持m次操作: 单点修改 1 pos val 询 ...
- ACM-ICPC 2019南昌网络赛F题 Megumi With String
ACM-ICPC 南昌网络赛F题 Megumi With String 题目描述 给一个长度为\(l\)的字符串\(S\),和关于\(x\)的\(k\)次多项式\(G[x]\).当一个字符串\(str ...
- 2019南昌网络赛G. tsy's number
题意:\(\sum_{i=1}^n\sum_{j=1}^n\sum_{k=1}^n\frac{\phi(i)*\phi(j^2)*\phi(k^3)}{\phi(i)*\phi(j)*\phi(k)} ...
随机推荐
- 2V转3V的电源芯片电路图,2.4V转3V电路
两节镍氢电池1.2V+1.2V是2.4V的标称电压,2.4V可以转3V输出电路应用. 在2.4V转3V和2V转3V的应用中,输出电流可最大600MA. 2V的低压输入,可以采用PW5100低压输入专用 ...
- 中断与系统调用深度分析(以网络编程接口SocketAPI为例)
1.从计算机CPU与I/O设备的交互方式谈起 计算机CPU与I/O设备的交互方式有最早的程序查询(也叫轮询)方式,发展到后来的程序中断方式,DMA方式等.简单来说,最早的程序查询方式的机制是,CPU若 ...
- elasticsearch-head:5连接elasticsearch 6.x无法显示浏览数据的解决方案
问题 在docker安装了elasticsearch-head:5和elasticsearch:6.3.2 打开界面连接es时发现数据无法展示. 解决方案 因docker使用的版本问题,可能名称略有变 ...
- 翻译 - ASP.NET Core 基本知识 - Web 主机 (Web Host)
翻译自 https://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/web-host?view=aspnetcore-5.0 ASP. ...
- JVM(四)打破双亲委派和SPI机制
前言: 我们都知道判断两个类是不是同一个,要根据类加载器和全限定名.这是为什么呢?为什么不同的类加载器加载同一个类是不同的呢? 答案就是,不同的类加载器所加载的类在方法区的存储空间是不同的即Insta ...
- SpringCloud zuul 网关限流分析
最近项目中 spring cloud zuul 运用到限流功能,打算配置一下就直接使用,不过在压测与调优过程中遇到一些没有预测到的问题,附上排查与解析结果 yml.pom配置 强烈推荐,按最新gith ...
- synchronized的jvm源码分析聊锁的意义
上篇写完了ReentrantLock源码实现,从我们的角度分析设计锁,在对比大神的实现,顺道拍了一波道哥的马屁,虽然他看不到,哈哈.这一篇我们来聊一聊synchronized的源码实现,并对比reen ...
- Netty服务端Server代码说明
本文是简单的Netty启动服务端代码理解笔记 public class MyServer { public static void main(String[] args) throws Excepti ...
- Flash 终将谢幕:微软将于年底( 2020 年 )停止对 Flash 的支持
近日,微软宣布将于今年 12 月终止对 Adobe Flash Player 的支持,届时,微软旗下所有浏览器都将无法使用 Flash,Adobe 也不会在今年 12 月后发布安全更新.早在 2017 ...
- Python学习【第2篇】:基本数据类型(详解)
1.数字 2.字符串中的方法 str test = "xiaoxing"#首字母大写v = test.capitalize()print(v)运行后结果如下Xiaoxing tes ...