第五集,不要007,要睡觉(矩阵快速幂)

第五集,不要007,要睡觉

TimeLimit:2000MS  MemoryLimit:128MB
64-bit integer IO format:%lld
 
Problem Description

话说上一集,我们的拯救世界六人组加一个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,其余人尾随进到了通道

 

 

Input

输入T表示测试案例的组数(1e3)

接下来T行,每行三个数字n, a, b (1 <= n,a,b <= 2^31 )

表示数列第一项是a, 第二项是b

 

Output

对于每组数据你需要输出一行,代表计算数列的第n项模2147493647 的结果。

SampleInput
2
3 1 1
3 1 2
SampleOutput
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 }

 


posted @ 2019-05-13 20:29  Q1311605467  阅读(223)  评论(0编辑  收藏  举报