zoukankan      html  css  js  c++  java
  • HDU

    题目:HDU5954

    题意:

    奶牛报数,先给两个数a和b,分别是f[n-2],f[n-1],之后每头奶牛i报数为f[i-1] + 2 * f[i-2] + i^4;给出n,求din头奶牛要报的数字,对2147493647取余。

    思路:

    看到这个式子知道这是一个矩阵快速幂,然后开始推式子,在我给队友写出平方差公式来队友看到杨辉三角形式后后,就去推7*7的矩阵快速幂了,但因为刚刚学这个,但结束就挂死在这个题上了。

    式子:

     之后就是套裸的矩阵快速幂就好了,个人感觉做题补题真的是长知识最快的方法啊。补题的时候自己直接用矩阵来写麻烦的要死,就把矩阵放在一个结构体中,顺便方便很多。

    代码:

    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <algorithm>
    #include <queue>
    #include <map>
    #include <set>
    #include <vector>
    using namespace std;
    typedef long long ll;
    const ll MOD = 2147493647;
    struct Maxt {
        ll mp[8][8];
        Maxt() {
            for(int i = 1; i<=7; i++) {
                for(int j = 1; j<=7; j++) {
                    mp[i][j] = 0;
                }
            }
        }
    } fp,tmp;
    int n,a,b,T;
    int read() {
        int res = 0;
        char op;
        op = getchar();
        if(op>='0' && op<='9') {
            res = op-'0';
            op = getchar();
        }
        while(op>='0' && op<='9') {
            res = res*10 + op-'0';
            op = getchar();
        }
        return res;
    }
    
    void init() {
        for(int i = 1; i<=7; i++) {
            for(int j =1; j<=7; j++) {
                fp.mp[i][j] = 0;
                tmp.mp[i][j] = 0;
            }
        }
        fp.mp[1][1] = 1,fp.mp[2][1] = 1,fp.mp[2][2] = 1,fp.mp[7][6] = 1;
        fp.mp[3][1] = 1,fp.mp[3][2] = 2,fp.mp[3][3] = 1,fp.mp[4][1] = 1;
        fp.mp[4][2] = 3,fp.mp[4][3] = 3,fp.mp[4][4] = 1,fp.mp[5][1] = 1;
        fp.mp[5][2] = 4,fp.mp[5][3] = 6,fp.mp[5][4] = 4,fp.mp[5][5] = 1;
        fp.mp[6][5] = 1,fp.mp[6][6] = 1,fp.mp[6][7] = 2;
        tmp.mp[1][1] = 1,tmp.mp[2][1] = 3,tmp.mp[3][1] = 9,tmp.mp[4][1] = 27,tmp.mp[5][1] = 81,tmp.mp[6][1] = b,tmp.mp[7][1] = a;
    }
    
    Maxt Maxtcalc(const Maxt& a,const Maxt& b) {
        Maxt t;
        for(int i = 1; i<=7; i++) {
            for(int j = 1; j<=7; j++) {
                t.mp[i][j] = 0;
                for(int k = 1; k<=7; k++) {
                    t.mp[i][j] = (t.mp[i][j] + (a.mp[i][k]*b.mp[k][j]) % MOD) % MOD;
                }
            }
        }
        return t;
    }
    
    Maxt qcalc(int x,Maxt s) {
        Maxt tmp;
        for(int i = 1; i<=7; i++) {
            tmp.mp[i][i] = 1;
        }
        while(x) {
            if(x&1) {
                tmp = Maxtcalc(tmp, s);
            }
            s = Maxtcalc(s, s);
            x>>=1;
        }
        return tmp;
    }
    
    int main() {
        T = read();
        while(T--) {
            n = read();
            a = read();
            b= read();
            if(n == 1) {
                printf("%d
    ",a);
                continue;
            }
            if(n == 2) {
                printf("%d
    ",b);
                continue;
            }
            if(n == 3) {
                printf("%d
    ",81+2*a+b);
                continue;
            }
            n = n-2;
            init();
            fp = qcalc(n,fp);
            Maxt ans =  Maxtcalc(fp, tmp);
            printf("%lld
    ",ans.mp[6][1]%MOD);
        }
        return 0;
    }
    /*
    样例输入:
    2
    3 1 2
    4 1 10
    样例输出:
    85
    369
    */
    View Code
  • 相关阅读:
    PHP下编码转换函数mb_convert_encoding与iconv的使用说明
    腾讯视频嵌入网页的方法 腾讯视频网页嵌入代码方法
    Agile工作方法
    居然有这种操作?各路公司面试题(作者:马克-to-win)
    IBM QMF下载
    AIX 常用命令 第一步(uname,lspv)
    TeraTerm下载
    TeraTerm设定(解决日文乱码问题)
    TeraTerm设定(窗体大小,字体字号)保存为默认值
    view class source code with JAD plugin in Eclipse
  • 原文地址:https://www.cnblogs.com/sykline/p/9769878.html
Copyright © 2011-2022 走看看