【JZOJ 4798】天使的分裂
来源:互联网 发布:lsv软件 编辑:程序博客网 时间:2024/04/26 05:59
Description
Solution
其实这一道题只是一道矩阵乘法。
Solution1
题解的做法是这样的:
所以有递推式:
直接用矩阵乘法。
复杂度:
Solution2
下图表示的是
有一个很显然的结论:
我们试把0的情况和1的情况加起来,于2进行比较,发现很多都可以两两抵消,只多了
而对于奇数i的情况(如把情况1加2与情况3比较),我们发现,两两可以抵消只剩下情况i-1中的中间的数的平方,和情况i的中间两个的互相乘。即
再仔细一化简,发现每轮另外加的f存在递推关系(其实就是斐波拉切数列)。
所以有递推式:
直接用矩阵乘法。
复杂度:
Code
#include<iostream>#include<cstdio>#include<cstdlib>#define fo(i,a,b) for(int i=a;i<=b;i++)using namespace std;typedef long long LL;const int N=5,mo=998244353;LL n;LL f[N]={2,1,1,1,3};LL a[N][N]={{1,1,0,0,1},{1,0,0,0,1},{1,0,1,1,1},{1,0,1,0,1},{0,0,0,0,1}};LL s[N][N];void chenj(){ fo(i,0,4) fo(j,0,4) { s[i][j]=0; fo(k,0,4)s[i][j]=(s[i][j]+a[i][k]*a[k][j]%mo)%mo; } fo(i,0,4) fo(j,0,4)a[i][j]=s[i][j];}void chen(){ fo(i,0,4) { s[1][i]=0; fo(j,0,4)s[1][i]=(s[1][i]+a[j][i]*f[j]%mo)%mo; } fo(i,0,4)f[i]=s[1][i];}int main(){ int q,w; scanf("%lld",&n); if(!n){printf("1\n");return 0;} n--; while(n) { if(n&1)chen(); chenj();n>>=1; } printf("%lld\n",f[4]); return 0;}
0 0
- 【JZOJ 4798】天使的分裂
- 【JZOJ 4798】 天使的分裂
- JZOJ 4798. 天使的分裂
- JZOJ 4798 【NOIP2016提高A组模拟9.24】天使的分裂
- [JZOJ4798] 天使的分裂
- 【JZOJ4798】天使的分裂
- 天使的分裂
- 【NOIP模拟】天使的分裂
- NOIP提高组【JOZJ4798】天使的分裂
- 【NOIP提高组】天使的分裂
- 【NOIP2016提高A组模拟9.24】天使的分裂
- JZOJ4798. 【NOIP2016提高A组模拟9.24】天使的分裂
- 【NOIP2016提高A组模拟9.24】天使的分裂
- 天使的分裂【NOIP2016提高A组模拟9.24】
- 【NOIP2016提高A组模拟9.24】天使的分裂
- 【NOIP2016提高A组模拟9.24】天使的分裂 (矩阵乘法)
- {题解}[jzoj4798] 【NOIP2016提高A组模拟9.24】天使的分裂
- Java世界的分裂
- Android 开源框架Universal-Image-Loader完全解析(一)--- 基本介绍及使用
- Leetcode 86 Partition List
- Jetty使用攻略
- #include <head.h>与#include "head.h"的区别
- HDU 5903 Square Distance
- 【JZOJ 4798】天使的分裂
- spring学习(官网)——解决版本冲突问题
- ul li datalist控件导航栏动态绑定数据库,并且显示相应的内容
- Android全屏沉浸式应用
- 观察者模式
- 玲珑杯 1009 Spoon Devil's Bucket 矩阵优化DP
- 总结:关于字符串长度的问题
- 浅谈HSSF的单元格合并与cell样式
- 光场相机预处理 TFTOOLBOX