Starry的神奇魔法 矩阵快速幂
题目描述
啦啦啦,Starry正愉快的做着编程题,代码是多么优美呀!突然,有人问他一道数学题,对于数学渣渣的Starry来说,这是多么的烦恼呀。不过不要紧,他还可以问其他人的,所以他想到了聪明的你们。这个问题是由一个神奇的魔法师提出的,他创造了一种魔法,每次使用魔法可以让今天的魔力值为前一天魔力值的2018倍+前两天魔力值的8倍+前三天魔力值的12倍。当然,一天只能使用一次魔法,除了使用魔法外,每天魔法师还能产生8888的魔力值。第一、二、三天的初始魔力值为888。他想问的是第n天他可以拥有多少魔力值。
输入
第一行输入一个T表示有TT个问题(1≤T≤104)(1≤T≤104)。
接下来T行,每行有一个数n(1≤n≤1018)n(1≤n≤1018),表示第nn天。
输出
输出TT行,每行输出第nn天的魔力值,由于数很大,结果对2018081220180812取模。
样例输入
3 2 5 8
样例输出
888 17299052 16854116 解题思路:数据太大,不能打表不能暴力,就用矩阵快速幂。矩阵1:{888,888,888,8888},矩阵二:{{2018,1,0,0},{8,0,1,0},{12,0,0,0},{1,0,0,1}};矩阵1的意义:{f1,f2,f3,c},fn为第几的天数,c为常量。推导见基础矩阵快速幂的斐波那契数列;参考博客:https://www.cnblogs.com/cmmdc/p/6936196.html以下为ac代码:
1 #include<iostream> 2 using namespace std; 3 const int mod=20180812; 4 struct P{ 5 long long a[4][4]; 6 }num,rex; 7 long long f[4]; 8 void init() 9 { 10 f[0]=f[1]=f[2]=888;f[3]=8888; 11 num.a[0][0]=2018;num.a[0][1]=1;num.a[0][2]=0;num.a[0][3]=0; 12 num.a[1][0]=8;num.a[1][1]=0;num.a[1][2]=1;num.a[1][3]=0; 13 num.a[2][0]=12;num.a[2][1]=0;num.a[2][2]=0;num.a[2][3]=0; 14 num.a[3][0]=1;num.a[3][1]=0;num.a[3][2]=0;num.a[3][3]=1; 15 return; 16 } 17 P fun(P x,P y) 18 { 19 P tmp; 20 for(int i=0;i<4;i++) 21 for(int j=0;j<4;j++) 22 tmp.a[i][j]=0; 23 for(int i=0;i<4;i++) 24 for(int j=0;j<4;j++) 25 for(int k=0;k<4;k++) 26 tmp.a[i][j]=(tmp.a[i][j]+(x.a[i][k]*y.a[k][j])%mod)%mod; 27 return tmp; 28 } 29 void quickp(long long n) 30 { 31 for(int i=0;i<4;i++) 32 for(int j=0;j<4;j++) 33 { 34 if(i==j) rex.a[i][j]=1; 35 else rex.a[i][j]=0; 36 } 37 while(n) 38 { 39 if(n&1) 40 rex=fun(rex,num); 41 num=fun(num,num); 42 n>>=1; 43 } 44 return; 45 } 46 int main() 47 { 48 long long t,n; 49 scanf("%lld",&t); 50 while(t--) 51 { 52 long long ans=0; 53 init(); 54 scanf("%lld",&n); 55 if(n<=3) 56 cout<<"888"<<endl; 57 else 58 { 59 quickp(n-3); 60 for(int i=0;i<4;i++) 61 ans=(ans+(f[i]*rex.a[i][0])%mod)%mod; 62 printf("%lld\n",ans); 63 } 64 } 65 return 0; 66 }
转载于:https://www.cnblogs.com/wwq-19990526/p/9467548.html
Starry的神奇魔法 矩阵快速幂相关推荐
- D.Starry的神奇魔法(矩阵快速幂)
/*D: Starry的神奇魔法 Time Limit: 1 s Memory Limit: 128 MB Submit My Status Problem Description ...
- D: Starry的神奇魔法(矩阵快速幂)
题目链接:https://oj.ismdeep.com/contest/Problem?id=1284&pid=3 D: Starry的神奇魔法 Time Limit: 1 s Me ...
- 矩阵快速幂 学习笔记
据说,矩阵快速幂在递推式优化上相当神奇,而且效率很高... 两矩阵相乘,朴素算法的复杂度是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 ...
最新文章
- 防护很重要!教你教你认识和检验安防产品的IP防护等级
- java jdbc 链接pg_Java零基础教程
- 区分 JVM 内存结构、 Java 内存模型 以及 Java 对象模型 三个概念
- 再品Resnet残差网络
- JZOJ.5274【NOIP2017模拟8.14】数组
- 原生javaScript中使用Ajax实现异步通信
- 在Linux下使用dnw和u-boot烧写系统
- linux 后台进程管理,Linux 后台进程管理利器 Supervisor
- Java奖学金评定系统设计与实现
- 最短路径问题---SPEA算法详解
- 【数据库原理】关系-Relationship
- M1版MacBookAir使用情况(供购买参考)
- 用计算机算加法与乘法应该怎么算,你知道计算机是怎么计算加减乘除算式的么?...
- 这一周 火火火 的 GitHub 项目
- 澳大利亚:千万别惹这几种蛇,它们可是人类的噩梦
- System.DllNotFoundException: Unable to load DLL 'XX.dll': 找不到指定的模块。 (Exception from HRESULT:
- 2023年3月华为认证HCIP新增题库(考试编号H12-821)
- 行内元素、块元素、行内块元素的区别
- VMWare 下完美安装 Mac OS X
- 【PHP】实现验证码图片