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)

给你一个操作次数Q,再给你一个初始n的值,令A1=F(n1),A2=F(n2),…Aq=F(nq),其中n1=n,ni=Ai-1*Ai-1^ni-1,输出所有A的异或和。

解法:偷鸡成功!不知道多少人是按题解那样预处理来降低复杂度的,估计大多数都不是正解做法吧。
首先F(n)是类斐波那契数列,第一反应矩阵快速幂,一看询问107,要O(1)!计划破产。仔细读题发现是异或,一定要在线操作,但是怎么在常数时间内直接知道答案呢?我们尝试去找F(n)的循环节,再次失败,模数太大找不到,倒是把F(n)的公式推了出来。带根号17,无法快速幂,队友找到该模数下根号17的代替数,转换,把每次查询复杂度降到了log,只要几次快速幂就可以,没了矩阵的常数。因为过的人很多,就以为数据很水,降到log就可以了,于是尝试交了一发。
你以为AC了?TLE!!!果然再多努力都是白费。
本来想着放弃,队友没事干打了个表,循环了!马上换了几个n多打了几个表,惊奇的发现,在Q达到105以后,不知道为什么,答案会出现循环,把Q分
一下奇数偶数就可以,一发AC。

下面是AC代码:

#include <bits/stdc++.h>
using namespace std;
using namespace chrono;
const int N = 100000005;
const int M = 998244353;
const int S = 473844410;
const int INF = 0x3f3f3f3f;
const double PI = acos(-1);
const double eps = 1e-8;
#define ms(x, y) memset((x), (y), sizeof(x))
#define mc(x, y) memcpy((x), (y), sizeof(y))
typedef long long ll;
typedef unsigned long long ull;
#define fi first
#define se second
#define mp make_pair
typedef pair<int, int> pii;
typedef pair<ll, int> pli;
#define bg begin
#define ed end
#define pb push_back
#define al(x) (x).bg(), (x).ed()
#define st(x) sort(al(x))
#define un(x) (x).erase(unique(al(x)), (x).ed())
#define fd(x, y) (lower_bound(al(x), (y)) - (x).bg() + 1)
#define ls(x) ((x) << 1)
#define rs(x) (ls(x) | 1)
template <class T>
bool read(T & x) {char c;while (!isdigit(c = getchar()) && c != '-' && c != EOF);if (c == EOF) return false;T flag = 1;if (c == '-') { flag = -1; x = 0; } else x = c - '0';while (isdigit(c = getchar())) x = x * 10 + c - '0';x *= flag;return true;
}
template <class T, class ...R>
bool read(T & a, R & ...b) {if (!read(a)) return false;return read(b...);
}
mt19937 gen(steady_clock::now().time_since_epoch().count());
#define LL ll
LL a_b_MOD_c(LL a,LL b,LL mod){assert(b >= 0);LL ret = 1;a %= mod;while(b){if(b & 1) ret = ret * a % mod;a = a * a % mod;b >>= 1;}return ret;
}
const int inv2 = a_b_MOD_c(2, M - 2, M);
const int invS = a_b_MOD_c(S, M - 2, M);
const int a = S + 3;
const int b = 3 - S + M;
//(x^2)%n=a 求平方剩余,n必须是奇素数
//注意:如果a为负,则看题意,是否要化为a=(a%n+n)%n
int modsqr(int a,int n){int b,k,i,x;if(n==2) return a%n;if(a_b_MOD_c(a,(n-1)/2,n)==1){if(n%4==3)x=a_b_MOD_c(a,(n+1)/4,n);else{for(b=1;a_b_MOD_c(b,(n-1)/2,n)==1;b++){i=(n-1)/2;k=0;}do{i/=2;k/=2;if((a_b_MOD_c(a,i,n)*a_b_MOD_c(b,k,n)+1)%n==0)k+=(n-1)/2;}while(i%2==0);x=(a_b_MOD_c(a,(i+1)/2,n)*a_b_MOD_c(b,k/2,n))%n;}if(x*2>n)x=n-x;return x;}return -1;
}
const int step = 100000;
int main()
{time_point<steady_clock> start = steady_clock::now();int Q;ll n, ans = 0, plast, t = 0;read(Q, n);for (int i = 1; i <= Q; i++) {ll last = n <= 1 ? n : (a_b_MOD_c(a, n, M) - a_b_MOD_c(b, n, M) + M) * invS % M * a_b_MOD_c(inv2, n, M) % M;ans ^= last;n ^= last * last;if (i > 1) {if (last == plast) {t = i;plast = last;break;}}plast = last;}// cout << "check 1: " << t << ' ' << plast << endl;if (t && (Q - t) % 2 == 1)ans ^= plast;// cout << "check 2: " << t << ' ' << plast << endl;printf("%lld\n", ans);cerr << endl << "------------------------------" << endl << "Time: "<< duration<double, milli>(steady_clock::now() - start).count()<< " ms." << endl;return 0;
}

2019 ICPC 南昌网络赛 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南昌网络赛 E题 Magic Master 【双向队列】

    传送门:E.Magic Master John is not only a magic master but also a shuffling master. Famous though he is, h ...

  3. 2019 ICPC 徐州网络赛 J.Random Access Iterator

    2019 ICPC 徐州网络赛 J.Random Access Iterator 题目大意:给你n个点和n-1条边(树形结构),保证1为根节点,通过以下方式dfs遍历: 询问dfs到最深节点的概率(有 ...

  4. HDU - 5875 2016 ACM/ICPC 大连网络赛 H题 暴力

    题目链接 题意:给你一个区间l,r一直将val[l]模上val[l+1],val[l+2]...val[r],因为一个模上比前一个数小数是没有意义的,所以需要将每一个点找到右边第一个小于他的点就行. ...

  5. 2019 ICPC 南京网络赛 F Greedy Sequence

    You're given a permutation aa of length nn (1 \le n \le 10^51≤n≤105). For each i \in [1,n]i∈[1,n], c ...

  6. 2019 ICPC 上海网络赛 K. Peekaboo

    题目连接:https://nanti.jisuanke.com/t/41421 题意:给定三个整数a, b, c,求半径为a.b,圆心坐标为原点的两个同心圆上的整点间的距离为c的点对 题解:推一下圆上 ...

  7. 2019 ICPC 上海站网络赛 K.Peekaboo (圆上整点)

    https://nanti.jisuanke.com/t/41421 题意:给定平面上两个点到原点之间的距离aaa和bbb以及这两点之间的距离ccc,且这两点的坐标均是整数,求该两点可能的坐标,按字典 ...

  8. 2019 ICPC南昌邀请赛网络赛比赛过程及题解

    解题过程 中午吃饭比较晚,到机房lfw开始发各队的账号密码,byf开始读D题,shl电脑卡的要死,启动中...然后听到谁说A题过了好多,然后shl让blf读A题,A题blf一下就A了.然后lfw读完M ...

  9. 2019 ACM - ICPC 上海网络赛 E. Counting Sequences II (指数型生成函数)

    繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...

最新文章

  1. Application Virtualization 4.5 部署之(三)(
  2. loadRunner12试用
  3. 2021牛客暑期多校训练营2 G.League of Legends(转化+单调队列)
  4. jsp mysql做登入界面_用jsp实现网站登录界面的制作,并连接数据库
  5. java不能打开串口_java打不开串口,我已经放入那两个文件了,但是报错了,调用不了...
  6. Android_撕衣服小案例
  7. 关于umask函数和creat函数
  8. jdk动态代理详解(通俗易懂,5分钟带你快速理解动态代理)全网最简
  9. VS2017 离线安装包下载
  10. linux系统网络代理设置
  11. 《软件工程》-软件质量管理
  12. 青少年编程scratch一级-熟悉编程软件(答案及详解+线上题库答题)
  13. Reporting Services 配置工具
  14. 抖音直播各类话术?开场、留人、促单互动话术合集
  15. 【Spring-MVC基础】由浅入深-Spring MVC
  16. matlab画分形minkowski,分形系列之matlab绘制koch曲线
  17. 【数据库系统】数据库系统学习与实践系列文章汇总目录(持续更新中)
  18. 计算机网络的发展趋势_MobiHoc-B类会议佼佼者 | CCF计算机网络领域
  19. Netty中的粘包拆包
  20. 基于Kibana的可视化监控报警插件 KAAE 的配置

热门文章

  1. linux不能强制显卡分辨率,Linux系统装显卡驱动及分辨率不正常的解决方法
  2. php字符窜转json_php如何将字符串转换json
  3. GitHub加载过慢或加载不出来应该怎么解决
  4. 天下大势,分久必合,合久必分
  5. 快速实现渠道二维码生成与统计
  6. 探秘SLAM之RANSAC算法
  7. 人工智能、机器学习、数据挖掘等基础概念-考研复试面试
  8. [CISCN2019 总决赛 Day2 Web1]Easyweb1
  9. 恢复和保护视力的方法
  10. VMware卸载不干净导致无法重新安装问题(亲测有效)