您现在的位置: 主页 > 嵌入式软件 > C/C++ > Recursivesequence(HDU5950矩阵快速幂)
本文所属标签:
为本文创立个标签吧:

Recursivesequence(HDU5950矩阵快速幂)

来源:fromnet 网络用户发布,如有版权联系网管删除 2018-10-12 

题目:

Farmer John likes to play mathematics games with his N cows. Recently, they are attracted by recursive sequences. In each turn, the cows would stand in a line, while John writes two positive numbers a and b on a blackboard. And then, the cows would say their identity number one by one. The first cow says the first number a and the second says the second number b. After that, the i-th cow says the sum of twice the (i-2)-th number, the (i-1)-th number, andi4i4. Now, you need to write a program to calculate the number of the N-th cow in order to check if John’s cows can make it right.

Input:

Farmer John likes to play mathematics games with his N cows. Recently, they are attracted by recursive sequences. In each turn, the cows would stand in a line, while John writes two positive numbers a and b on a blackboard. And then, the cows would say their identity number one by one. The first cow says the first number a and the second says the second number b. After that, the i-th cow says the sum of twice the (i-2)-th number, the (i-1)-th number, andi4i4. Now, you need to write a program to calculate the number of the N-th cow in order to check if John’s cows can make it right.

Output:

For each test case, output the number of the N-th cow. This number might be very large, so you need to output it modulo 2147493647.

Hint:

In the first case, the third number is 85 = 2*1+2+3^4.
In the second case, the third number is 93 = 2*1+1*10+3^4 and the fourth number is 369 = 2 * 10 + 93 + 4^4.

题意:

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

思路:

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

具体式子如下:

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

代码:

#include #include #include #include #include #include #include <set>#include 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("%dn",a);            continue;        }        if(n == 2) {            printf("%dn",b);            continue;        }        if(n == 3) {            printf("%dn",81+2*a+b);            continue;        }        n = n-2;        init();        fp = qcalc(n,fp);        Maxt ans =  Maxtcalc(fp, tmp);        printf("%lldn",ans.mp[6][1]%MOD);    }    return 0;}/*样例输入:23 1 24 1 10样例输出:85369*/
View Code



              查看评论 回复



嵌入式交流网主页 > 嵌入式软件 > C/C++ > Recursivesequence(HDU5950矩阵快速幂)
 矩阵 这个 式子

"Recursivesequence(HDU5950矩阵快速幂)"的相关文章

网站地图

围观()