题意:

传送门
已知\(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\)。

思路:

原式是一个二次常数递归式,我们可以求得它的通项为:
\[ F(n)=\frac{1}{\sqrt{17}}[(\frac{3+\sqrt{17}}{2})^n-(\frac{3-\sqrt{17}}{2})^n] \]
经过二次剩余等乱七八糟的操作,我们能直接\(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;
}

转载于:https://www.cnblogs.com/KirinSB/p/11495100.html

2019南昌网络赛H The Nth Item(二阶线性数列递推 + 广义斐波那契循环节 + 分段打表)题解...相关推荐

  1. 2019南昌网络赛 H. The Nth Item(广义斐波那契数列求通项公式模板)(二次剩余+分块)

    链接:https://nanti.jisuanke.com/t/41355 题意: Q个询问,每次求F(N),但是N要用上一次询问的结果得到. 思路: 1.直接矩阵快速幂求,再用map记一下答案,求过 ...

  2. 2019 ICPC 南昌网络赛 H. The Nth Item

    2019 ICPC 南昌网络赛 H. The Nth Item 题目大意:已知一个数列F(n): F(0)=0,F(1)=1 F(n)=3∗F(n−1)+2∗F(n−2),(n≥2) ​ 给你一个操作 ...

  3. 2017年ACM第八届山东省赛I题: Parity check(判断 第n项斐波那契数列奇偶性)

    I: Parity check 题目描述 Fascinated with the computer games, Gabriel even forgets to study. Now she need ...

  4. 2019 南昌网络赛D FFT多个多项式相乘

    2019 Asia Nanchang D. Interesting Series 链接:https://nanti.jisuanke.com/t/41351 题意:首先题目给了若干定义 定义:Fn=( ...

  5. 2019南昌网络赛 C题,Hello 2019

    题意:求包含9012,但是不包含8012的最小删除次数 解题思路:首先将字符串反转,按照题解思路为线段树维护矩阵即可 我们将线段树的每个区间用矩阵表示,矩阵mat[5][5]维护2019这个序列的情况 ...

  6. 2019南昌网络赛G. tsy‘s number(反演 + 积性函数O(n)预处理)

    tsy's number 推式子 ∑i=1n∑j=1n∑k=1nϕ(i)ϕ(j2)ϕ(k3)ϕ(i)ϕ(j)ϕ(k)ϕ(gcd(i,j,k))我们假定j=p1k1p2k2p3p3--pnkn,有ϕ(j ...

  7. 2019南昌网络赛  I. Yukino With Subinterval 树状数组套线段树

    I. Yukino With Subinterval 题目链接: Problem Descripe Yukino has an array \(a_1, a_2 \cdots a_n\). As a ...

  8. 2019南昌网络赛 Yukino With Subinterval —— 树套树 或 cbq分治

    题目链接:点我啊╭(╯^╰)╮ 评测机好像换了,没有当初那么卡了... 最快写法: #include<bits/stdc++.h> #define rint register int #d ...

  9. 2019南昌网络赛-I(单调栈+线段树)

    题目链接:https://nanti.jisuanke.com/t/38228 题意:定义一段区间的值为该区间的和×该区间的最小值,求给定数组的最大的区间值. 思路:比赛时还不会线段树,和队友在这题上 ...

  10. 2019年ACM-ICPC - 南昌网络赛I:Yukino With Subinterval【带修主席树】

    题目: 2019ICPC南昌网络赛I:Yukino With Subinterval 题意: 给定长度为 N 的数组,有两种操作:(1)单点修改,(2)查询区间[qL,qR]内有多少个不同的段(连续相 ...

最新文章

  1. python挖长尾词 源码,如何用代码挖局长尾关键词
  2. 你在面试时是否无意中暴露了缺点?资深面试官如何从细节中看候选人的软实力...
  3. 连接access时的REGDB_E_CLASSNOTREG(0x80040154)错误
  4. 利用html5实现上传图片预览
  5. c语言字符串如何调换位置,c语言字符串从第m个位置开始复制
  6. 在java语言中下列语句正确的是_java考试习题及答案
  7. WinRAR压缩文件参数详解
  8. 3.FXBLUE跟单原理
  9. 解决Microsoft Store应用商店打不开 代码: 0x80131500
  10. Gary Gygax的倒台,密切关注Linux端口等
  11. BAT机器学习面试1000道
  12. 64位 iee754_IEEE 754标准
  13. 第17届开源中国开源世界高峰论坛文集出版
  14. 记第一次使用CDSN进行学习记录
  15. 记录一个C++多线程的坑
  16. week9任务管理器和牌数大小的确定
  17. 微信怎么隐藏视频号入口
  18. 企业网盘知乎用户评测:企业网盘哪个好?
  19. 智能小区计算机网络系统,浅谈计算机网络系统在智能小区实现与运用.doc
  20. ORACLE学习笔记-CentOS 7.5 Oracle 19C安装部署

热门文章

  1. Android开发入门教程--3.Activity入门指南
  2. eclipse 配置多个tomcat
  3. vuejs 外部嵌套from表单
  4. 【Firewalld(Iptables)】
  5. C是一个结构化语言它的重点在于算法和数据结构
  6. 编程科普书籍推荐(Java)
  7. 现在该去外企吗?入职微软三个月的我告诉你!
  8. while (true) 和 for (;;) 哪个更快?
  9. 你们要的Windows IDEA 快捷键终极大全,速度收藏!
  10. 重构代码花 1 年!程序员血泪史:千万不要重写代码!