第五集,不要007,要睡觉(矩阵快速幂)
第五集,不要007,要睡觉
话说上一集,我们的拯救世界六人组加一个Home_W经过一系列的送死猜题意操作之后,终于来到了下一集,也就是这一集
一间写满了zzzz的房间内,突然进来了7个人
“这又是啥房间啊zzzzz?”,小A看着眼前的房间吐槽道,“到底还要闯几关啊”
“我也不懂啊”,小Home_W摊了摊手表示自己也不懂
“啥都木有发生,我们现在就等着gm给我们提示?”小A说道
大Home_W :“等吧”
一个小时后:
众人:“……”
金金金:“等个屁啊,我快睡觉了都,这可咋整啊,你们不困吗”
其他人看着金金金摇了摇头
金金金:“……”“你们是都失眠了吗,不需要睡觉吗,那我先睡吧”
“睡个屁,我睡不着,你也别想了”,一道愤怒的声音从天花板传来
金金金刚刚躺下,那块地板就把就把他弹上了天花板,啪,boog
两声,金金金已经嵌进了地板
“这里已经是通向无限手套的倒数第二个关卡,只要你们想办法让我入睡,我就放你们去下一关”,声音再次传来
“想睡觉还不简单吗,还不快去数绵羊”,布莱克说道
“那么简单,还会提出这个问题吗,吃我一道电”,一道555555亿V的电压劈到了布莱克身上
金金金:“我有一个东西可以立刻帮你睡着”,金金金从他的四次元菊花掏出了一个蚊香
“这个蚊香只要一被点着,无论是何等生物,机械都会立刻睡觉”
“真的吗?你试一下”
“行”,金金金立刻点着了蚊香,只见离蚊香最近的小Home_W一脸嫌弃的看着蚊香,结果一个呼吸
吸进了蚊香的气味,立刻就睡着了,然后金金金立刻救踩息了蚊香
“怎么样,信了吗”
“快给我,我立刻放你们过去”,金金金旁边立刻出现了一个机械手,冲向了金金金
金金金一个闪避躲过了机械手,说:“不行,你得先回答我一个问题,才可以,不然蚊香是不能交给你的”
“我看你是不想过去了”
“我看你是不想睡觉了”
“求你了,给我吧,我007几十年了”
“不行,必须回答我的问题”
“什么问题说吧”,那个声音妥协道
“在一个遥远的……”
“能不能长话短说,我很急的”
“行行行,一个遥远的国度,有许多的ACM题,有一位勇者永生永世都在与之做着斗争,这位勇士在开始做题的第一年能获得a点思维值,
第二年能够获得b点思维值。同时勇士计算出如果用f[n]表示第n年获得的思维值。那么当n>=3时有,F[n] = 2*f[n - 1] + 3*f[n - 2] + 3*n^5;勇士由于忙于刷题,所以希望你告诉他在第n年所获得的思维值是多少(ps: n^5表示n的五次方),我当初解开了那个勇士的谜题,于是他给我了这份蚊香,所以,你也得解开这个问题”
只见一段呲呲次的声音从天花板传过来,“解开了”,然后一个机械臂从地板伸了过来,然后一张纸被递给了金金金,
金金金看了看纸,点了点头,然后把蚊香递给了机械臂,
机械臂拿到了蚊香后,立刻打开了通向了下一关的通道,
大Home_W和布莱克抬着小Home_W,其余人尾随进到了通道
输入T表示测试案例的组数(1e3)
接下来T行,每行三个数字n, a, b (1 <= n,a,b <= 2^31 )
表示数列第一项是a, 第二项是b
对于每组数据你需要输出一行,代表计算数列的第n项模2147493647 的结果。
2 3 1 1 3 1 2
734 736
题解:这题很明显是个矩阵快速幂,但构造矩阵的时候不好构造, 因为有个n^5;
这里我们就需要吧n^5构造成与前一项相关,要是数学基础好可能会想到
想到这个后,那构造矩阵就很好构造了
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int maxn=8; 5 const long long MOD=2147493647; 6 const int n=8; 7 #define mod(x)((x)%MOD) 8 struct mat 9 { 10 ll m[maxn][maxn]; 11 12 } unit; 13 mat operator*(mat a,mat b) 14 { 15 mat ret; 16 ll x; 17 for(int i=0; i<n; i++) 18 { 19 for( int j=0; j<n; j++) 20 { 21 x=0; 22 for(int k=0; k<n; k++) 23 x+=mod(a.m[i][k]*b.m[k][j]); 24 ret.m[i][j]=mod(x); 25 } 26 27 } 28 return ret; 29 } 30 void init_unit() 31 { 32 for(int i=0; i<maxn; i++) 33 { 34 unit.m[i][i]=1; 35 } 36 } 37 mat pow_mat(mat a, ll n) 38 { 39 mat ret=unit; 40 while(n) 41 { 42 if(n&1) 43 { 44 ret=ret*a; 45 } 46 a=a*a; 47 n>>=1; 48 } 49 return ret; 50 } 51 int main() 52 { 53 54 ll x; 55 int t; 56 init_unit(); 57 scanf("%d",&t); 58 while(t--) 59 { 60 61 ll x,aa,bb; 62 scanf("%lld%lld%lld",&x,&aa,&bb); 63 if(x==1) 64 printf("%lld\n",aa); 65 else if(x==2) 66 printf("%lld\n",bb); 67 else 68 { 69 mat a,b; 70 b.m[0][0]= b.m[0][1]= b.m[0][2]= b.m[0][3]= b.m[0][4]= b.m[0][5]= b.m[0][6]= b.m[0][7]=0; 71 b.m[0][1]=1; 72 b.m[1][0]=3, b.m[1][1]=2, b.m[1][2]=3*1,b.m[1][3]=3*5, b.m[1][4]=3*10, b.m[1][5]=3*10, b.m[1][6]=3*5, b.m[1][7]=3*1; 73 b.m[2][0]=0, b.m[2][1]=0, b.m[2][2]=1,b.m[2][3]=5, b.m[2][4]=10, b.m[2][5]=10, b.m[2][6]=5, b.m[2][7]=1; 74 b.m[3][0]=0, b.m[3][1]=0, b.m[3][2]=0,b.m[3][3]=1, b.m[3][4]=4, b.m[3][5]=6, b.m[3][6]=4, b.m[3][7]=1; 75 b.m[4][0]=0, b.m[4][1]=0, b.m[4][2]=0,b.m[4][3]=0, b.m[4][4]=1, b.m[4][5]=3, b.m[4][6]=3, b.m[4][7]=1; 76 b.m[5][0]=0, b.m[5][1]=0, b.m[5][2]=0,b.m[5][3]=0, b.m[5][4]=0, b.m[5][5]=1, b.m[5][6]=2, b.m[5][7]=1; 77 b.m[6][0]=0, b.m[6][1]=0, b.m[6][2]=0,b.m[6][3]=0, b.m[6][4]=0, b.m[6][5]=0, b.m[6][6]=1, b.m[6][7]=1; 78 b.m[7][0]=0, b.m[7][1]=0, b.m[7][2]=0,b.m[7][3]=0, b.m[7][4]=0, b.m[7][5]=0, b.m[7][6]=0, b.m[7][7]=1; 79 a.m[0][0]=aa, a.m[1][0]=bb, a.m[2][0]=32, a.m[3][0]=16, a.m[4][0]=8, a.m[5][0]=4, a.m[6][0]=2, a.m[7][0]=1; 80 a=pow_mat(b,x-2)*a; 81 printf("%lld\n",a.m[1][0]); 82 } 83 } 84 return 0; 85 }