zoukankan      html  css  js  c++  java
  • 第五集,不要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
    ",aa);
    65         else if(x==2)
    66             printf("%lld
    ",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
    ",a.m[1][0]);
    82         }
    83     }
    84     return 0;
    85 }
    
    
  • 相关阅读:
    WEBUS2.0 In Action
    WEBUS2.0 In Action
    WEBUS2.0 In Action
    WEBUS2.0 In Action
    在Linux查看版本命令
    Increasing heap size while building the android source code on Ubuntu 15.10
    在Linux中增加swap空间
    Patch
    使用Vim比较两个文件的内容
    @override 重写 与重载
  • 原文地址:https://www.cnblogs.com/yuanlinghao/p/10858827.html
Copyright © 2011-2022 走看看