D: Starry的神奇魔法(矩阵快速幂)
题目链接:https://oj.ismdeep.com/contest/Problem?id=1284&pid=3
D: Starry的神奇魔法
Submit My Status
Problem Description
啦啦啦,Starry正愉快的做着编程题,代码是多么优美呀!突然,有人问他一道数学题,对于数学渣渣的Starry来说,这是多么的烦恼呀。不过不要紧,他还可以问其他人的,所以他想到了聪明的你们。这个问题是由一个神奇的魔法师提出的,他创造了一种魔法,每次使用魔法可以让今天的魔力值为前一天魔力值的2018倍+前两天魔力值的8倍+前三天魔力值的12倍。当然,一天只能使用一次魔法,除了使用魔法外,每天魔法师还能产生8888的魔力值。第一、二、三天的初始魔力值为888。他想问的是第n天他可以拥有多少魔力值。
Input
第一行输入一个T表示有TT个问题(1≤T≤104)(1≤T≤104)。
接下来T行,每行有一个数n(1≤n≤1018)n(1≤n≤1018),表示第nn天。
Output
输出TT行,每行输出第nn天的魔力值,由于数很大,结果对2018081220180812取模。
Sample Input
3 2 5 8
Sample Output
888 17299052 16854116
题目大意:f[1]=f[2]=f[3]=888;给出任意n(1<=n<=10^18),求f(n) = 2018*f(n-1)+8*f(n-2)+12*f(n-3)+8888。
解题思路:由递推公式我们可以得到以下矩阵:
通过递推可得到矩阵:
当n<=3时,直接输出888;
而当n>3时,直接计算上述矩阵式,先求出第一个矩阵的n-3次方,然后只要用第一个矩阵的第一行与第二个矩阵的第一列对应相乘相加即可得到答案。
附上代码:
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <queue> using namespace std; const int mod=20180812; const int maxn=4; typedef long long ll; struct Matrix{ll a[maxn][maxn]; };Matrix mul(Matrix a,Matrix b) //两矩阵相乘 {Matrix temp;memset(temp.a,0,sizeof(temp.a));for(int i=0;i<maxn;i++)for(int j=0;j<maxn;j++)for(int k=0;k<maxn;k++)temp.a[i][j]=(temp.a[i][j]+a.a[i][k]*b.a[k][j])%mod;return temp; }Matrix qpow(Matrix a,ll n) //矩阵快速幂 {Matrix ans;memset(ans.a,0,sizeof(ans.a));for(int i=0;i<maxn;i++)ans.a[i][i]=1; //化成单位矩阵 while(n){if(n&1) ans=mul(ans,a);a=mul(a,a);n/=2;}return ans; }int main() {int t;scanf("%d",&t);Matrix A;A.a[0][0]=2018,A.a[0][1]=8,A.a[0][2]=12,A.a[0][3]=1;A.a[1][0]=1,A.a[1][1]=0,A.a[1][2]=0,A.a[1][3]=0;A.a[2][0]=0,A.a[2][1]=1,A.a[2][2]=0,A.a[2][3]=0;A.a[3][0]=0,A.a[3][1]=0,A.a[3][2]=0,A.a[3][3]=1;while(t--){ll n;scanf("%lld",&n);if(n<=3){printf("888\n");continue;}Matrix x=qpow(A,n-3);ll ans=x.a[0][0]*888+x.a[0][1]*888+x.a[0][2]*888+x.a[0][3]*8888;printf("%lld\n",ans%mod);}return 0; }
转载于:https://www.cnblogs.com/zjl192628928/p/9536402.html
D: Starry的神奇魔法(矩阵快速幂)相关推荐
- Starry的神奇魔法 矩阵快速幂
题目描述 啦啦啦,Starry正愉快的做着编程题,代码是多么优美呀!突然,有人问他一道数学题,对于数学渣渣的Starry来说,这是多么的烦恼呀.不过不要紧,他还可以问其他人的,所以他想到了聪明的你们. ...
- D.Starry的神奇魔法(矩阵快速幂)
/*D: Starry的神奇魔法 Time Limit: 1 s Memory Limit: 128 MB Submit My Status Problem Description ...
- 矩阵快速幂 学习笔记
据说,矩阵快速幂在递推式优化上相当神奇,而且效率很高... 两矩阵相乘,朴素算法的复杂度是O(N^3).如果求一次矩阵的M次幂,按朴素的写法就是O(N^3*M).既然是求幂,不免想到快速幂取模的算法, ...
- 2021-2022年度第三届全国大学生算法设计与编程挑战赛(秋季赛)- 分组(矩阵快速幂套NTT优化dp)
题目链接:点击查看 题目大意:给出 nnn 个连续的小球,每次可以选择单独的一个或者相邻的两个小球分成一组,允许有剩余的小球,问恰好分成 k∈{1,2,3,⋯,m}k\in\{1,2,3,\cdots ...
- [选拔赛1]花园(矩阵快速幂),JM的月亮神树(最短路),保护出题人(斜率优化)
多年不考试,一夜回到解放前 T1:花园 title solution code T2:月亮神树 title solution code T3:保护出题人 title solution code T1: ...
- [BZOJ3583]杰杰的女性朋友(矩阵快速幂)
杰杰的女性朋友 时间限制:10s 空间限制:256MB 题目描述 杰杰是魔法界的一名传奇人物.他对魔法具有深刻的洞察力,惊人的领悟力,以及令人叹为观止的创造力.自从他从事魔法竞赛以来,短短几 ...
- 快速幂或者矩阵快速幂
快速幂或者矩阵快速幂在算大指数次方时是很高效的,他的基本原理是二进制,下面的A可以是一个数也可以是一个矩阵(本文特指方阵),若是数就是快速幂算法,若是矩阵就是矩阵快速幂算法,用c++只需把矩阵设成一个 ...
- 数字迷阵(矩阵快速幂+结论题)
数字迷阵(矩阵快速幂+结论题) 题目描述 小可可参观科学博物馆时,看到一件藏品,上面有密密麻麻的数字,如下所示: 1 2 3 5 8 13 21 34 55 ...
- 矩阵快速幂+构造方法
与快速幂一样,可以将递推式通过二进制的方式来进行优化,这个学了快速幂就是十分容易理解 大概的板子如下: struct mat///自己定义大小的矩阵 {ll m[11][11]; }; mat mul ...
最新文章
- LeetCode简单题之整理字符串
- android 上拉隐藏布局,Recycleview上拉隐藏与下拉显示
- Oracle 实例恢复时 前滚(roll forward) 后滚(roll back) 问题
- 学音视频一定要掌握这几个算法
- spring test---restful与文件上传
- python变量标识符_Python 1基础语法三(变量和标识符的区别)
- 电脑c盘怎么清理_电脑C盘内存不足?三分钟教你彻底清理C盘空间,瞬间多出10个G...
- 详解回调函数(同步回调,异步回调)
- c语言入门到精通怎么能少了这7本书籍?
- linux 2.6下eeprom at24c08 i2c设备驱动(new style probe方式)
- python谢尔宾斯基三角形
- 【HAVENT原创】Firebase 相关操作及代码示例
- 惠普触控板使用指南_惠普笔记本触摸板使用技巧
- 海康威视摄像头安装与配置
- OSChina 周日乱弹 —— 别国的程序员是怎么结婚的
- 无配置WCF客户端的一个简单到令人发指的实现方法
- 《Effective C++》学习笔记——条款45
- mysql connector安装教程_Debezium:mysql connector安装
- 使用redis incr处理并发,存在死锁问题
- 谷歌浏览器chrome安装vuejs devtools 插件
热门文章
- 解决windows安装mongodb出现dbexit: rc:100错误
- Mysql数据库Sql语句执行效率-Explain
- spring-注解实现入门
- 在不停止mysql复制主服务器的情况下,配置一个mysql复制从服务器
- Linq to Oracle 使用教程(七)将数据库的存储过程映射到方法
- java方法中与参数怎么调用_与Java方法调用中的类型参数有关的问题
- 计算机应用基础模块2客观题答案 文档,卓顶精文2019计算机应用基础网上形考答案模块2 Word 2010 文字处理系统客观题答案...
- java se 8 新特性_javase8-sample
- 笑傲江湖手3D游服务器端文件,新笑傲江湖手游7月2日部分服务器数据互通预告...
- 希尔排序的详细过程_算法系列: 10大常见排序算法(4)希尔排序