题目链接:点击查看

题目大意:给定一个变形版的斐波那契数列,F(n)为其对应的函数值,初始时给定一个q和一个a1,规定下面两个递推式:

  1. ^
  2. ans^=

最后输出ans

题目分析:对于变形版的斐波那契函数,因为给出的n的范围到了1e18,所以肯定不能打表预处理,只能用矩阵快速幂,每次查询都是logn级别的时间复杂度,而总的需要迭代q次,即最坏情况到了1e7*log1e18,是4e8,如果直接交肯定会T掉,我们一开始是想找循环节,找An=An+1的时候,虽然没找到什么规律,但是却发现等到数很大的时候,ans就不会再改变了,也就是说每次斐波那契函数只需要记忆化一下,返回一个值即可,而不需要每次都重复计算,也就是用记忆化搜索的思想,该怎么实现呢?昨天刚学了一手unordered_map可以O1查找,所以就加了这句话优化了一下,就直接过了。。也不知道是碰上正解了还是数据水了,正解的话有些麻烦,是将原斐波那契数列化为一般式,然后转化成通过两次矩阵快速幂求得答案,并且预处理快速幂的答案(转换后的数据范围小多了),这样就能达到O1查询,也就是最坏情况也只有1e7了

上代码吧:

暴力+unordered_map:

#include<iostream>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cctype>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<set>
#include<map>
#include<unordered_map>//C++11
using namespace std;typedef long long LL;const int N=2;const LL M=998244353;LL n,q;struct Ma
{LL a[N][N];
};Ma operator *(Ma a,Ma b)
{Ma temp;for(int i=0;i<N;i++)for(int j=0;j<N;j++){temp.a[i][j]=0;for(int k=0;k<N;k++)temp.a[i][j]=(temp.a[i][j]+(a.a[i][k]*b.a[k][j])%M)%M;}return temp;
}Ma Pw(Ma a,LL b)
{Ma ans;memset(ans.a,0,sizeof(ans.a));for(int i=0;i<N;i++)ans.a[i][i]=1;while(b){if(b&1)ans=ans*a;a=a*a;b>>=1;}return ans;
}unordered_map<LL,LL> mp; LL F(LL x)
{if(mp[x])return mp[x];if(x==0)return 0;if(x==1)return 1;Ma ans;ans.a[0][0]=3;ans.a[0][1]=1;ans.a[1][0]=2;ans.a[1][1]=0;ans=Pw(ans,x-1);Ma temp;temp.a[0][0]=1;temp.a[0][1]=0;return mp[x]=(temp*ans).a[0][0];
}int main()
{while(scanf("%lld%lld",&q,&n)!=EOF){int i;LL n1=n;LL a1=F(n1);LL ans=a1;for(i=2;i<=q;i++){n1^=(a1*a1);   a1=F(n1);ans^=a1;}printf("%lld\n",ans);}return 0;
}

2019ICPC(南昌) - The Nth Item(矩阵快速幂)相关推荐

  1. LightOJ 1096 - nth Term 矩阵快速幂

    http://www.lightoj.com/volume_showproblem.php?problem=1096 题意:\(f(n)  = a * f(n-1) + b * f(n-3) + c, ...

  2. generator 1【矩阵快速幂】

    题目描述 You are given four positive integers x0,x1,a,bx_0, x_1, a, bx0​,x1​,a,b. And you know xi=a⋅xi−1 ...

  3. 矩阵快速幂(矩阵加速)

    //南昌理工ACM集训队 放心食用 矩阵加速 快速幂(前置技能) 矩阵快速幂 可乐 附个模板 最后小结 本人小白如有不对欢迎指正ლ(╹◡╹ლ) 矩阵加速 快速幂(前置技能) 对于普通的求a的b次方,一 ...

  4. 数论-快速幂、矩阵快速幂、慢速乘

    文章目录 快速幂 矩阵快速幂 慢速乘 例题 HDU-2817 HDU-3117 XUJC-1395 快速幂 首先幂运算 a n a^n an就是 n n n个 a a a相乘,我们可以直接调用库函数 ...

  5. 2020.7.20【算协集训】矩阵快速幂

    算法分析与排序 A - Fibonacci (POJ - 3070) 分析 代码 B - Tr A (HDU - 1575) 分析 代码 C - A Simple Math Problem (HDU ...

  6. 矩阵快速幂+构造方法

    与快速幂一样,可以将递推式通过二进制的方式来进行优化,这个学了快速幂就是十分容易理解 大概的板子如下: struct mat///自己定义大小的矩阵 {ll m[11][11]; }; mat mul ...

  7. 【做题】SRM701 Div1 Hard - FibonacciStringSum——数学和式&矩阵快速幂

    原文链接 https://www.cnblogs.com/cly-none/p/SRM701Div1C.html 题意:定义"Fibonacci string"为没有连续1的01串 ...

  8. 快速幂 + 矩阵快速幂

    快速幂 1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #define LL lo ...

  9. HDU4549(矩阵快速幂+快速幂)

    f(n)=a^f(n-1) + b^f(n-2):计算矩阵部分用矩阵快速幂:计算a的幂次和b的幂次用快速幂. #include<iostream> #include<algorith ...

最新文章

  1. inner join on, left join on, right join on要详细点的介绍?内连接,左外连接,右外连接。...
  2. python软件下载安装要钱吗-PyCharm下载和安装详细步骤
  3. 在NVIDIA Jetson Xavier NX上安装llvmlite报错:No such file or directory: ‘llvm-config‘: ‘llvm-config‘
  4. 组会PPT20200522《Summary of Study and Research from May 8 to May 21》
  5. 第46条:不要使用 dispatch_get_current_queue
  6. 【20171123】【GITC精华演讲】贝业新兄弟李济宏:如何做到企业信息化建设的加减乘除...
  7. 第六天,字典Dictionary
  8. 23-Ubuntu-文件和目录命令-查看文件内容-more 和 cat
  9. C++ - extern C用法浅析
  10. oracle人才盘点演示,Oracle 11g Golden Gate DDL单向同步实例演示
  11. 深度学习2.0-26.Regularization减轻overfitting
  12. 【js高级程序设计】迭代器
  13. 32、至少列举8个常用模块都有那些?
  14. 常用的ADB命令介绍
  15. 第一至七次人口区县级普查-GIS人口数据集(最新)
  16. access 知乎 窗体_ACCESS数据可视化之路
  17. 官方免费申请许可证-VMware Fusion 12 – Personal Use License
  18. 计算机自动重启快捷键,待机和重启电脑的快捷键
  19. linux驱动之输入子系统
  20. 兜兜转转~~,忘不了的break!! 忘不了的continue!!!!

热门文章

  1. Eureka-提供者与消费者
  2. SpringBoot底层注解-@ImportResource导入Spring配置文件
  3. eureka对比Zookeeper:
  4. 接口方法和映射器的statement id 是怎么绑定起来的?
  5. HandlerMappings
  6. SpringMVC的请求-文件上传-客户端表单实现
  7. 为什么我们要学习Java虚拟机?
  8. 文件上传之Springmvc方式上传原理分析
  9. 对计算机的理解大一1000,大一计算机实训报告总结范文-求计算机实习报告1000字左右,急急急?...
  10. ios上编译c语言的app,iOS App编译流程