hdu2256Problem of Precision+矩阵快速幂+广义斐波拉契

原创 2016年08月31日 10:53:36

Problem Description

这里写图片描述

Input
The first line of input gives the number of cases, T. T test cases follow, each on a separate line. Each test case contains one positive integer n. (1 <= n <= 10^9)

Output
For each input case, you should output the answer in one line.

Sample Input

3
1
2
5

Sample Output

9
97
841

Source
HDOJ 2008 Summer Exercise(4)- Buffet Dinner

Recommend
lcy

计算(2+3)2nmod1024
思路:

f(n)=(2+3)2n=(5+26)n=An+Bn6

f(n1)=An1+Bn16

f(n)=(5+26)f(n1)

f(n)=(5An1+12Bn1)+(2An1+5Bn1)6
所以递推矩阵就是:
这里写图片描述

A1=5,B1=2.

然后套矩阵快速幂模板即可求出An,Bn.

(5+26))n=An+Bn6

(526))n=AnBn6

(5+26))n+(526)n=2An

(526))n<1

(5+26))n=2An1

所以最后答案就是2An1

#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<queue>
#include<vector>
#include<map>
#include<stack>
#include<set>
using namespace std;
#define pi acos(-1.0)
#define EPS 1e-6    //log(x)
#define e exp(1.0); //2.718281828
//#define mod 1000000007
#define INF 0x7fffffff
#define inf 0x3f3f3f3f
#pragma comment(linker,"/STACK:102400000,102400000")
typedef long long LL;

#define debug(x) cout<<x<<endl;
#define debug2(x) cout<<x<<" ";

//#define MOD 10000007
LL MOD;
struct Mat{
    int n,m;
    LL mat[9][9];
};
Mat operator *(Mat a,Mat b){
    Mat c;
    memset(c.mat,0,sizeof(c.mat));
    c.n = a.n,c.m = b.m;

    for(int i=1;i<=a.n;i++){
        for(int j=1;j<=b.m;j++){
            for(int k=1;k<=a.m;k++){
                c.mat[i][j] += (a.mat[i][k]*b.mat[k][j])%MOD;
                c.mat[i][j] %= MOD;
            }
        }
    }
    return c;
}
Mat operator +(Mat a,Mat b){
    Mat c;
    memset(c.mat,0,sizeof(c.mat));
    c.n = a.n,c.m = a.m;

    for(int i=1;i<=a.n;i++){
        for(int j=1;j<=a.m;j++){
            c.mat[i][j] = (a.mat[i][j]+b.mat[i][j])%MOD;
        }
    }
    return c;
}
Mat operator ^(Mat a,LL k){
    Mat c;
    memset(c.mat,0,sizeof(c.mat));
    c.n = a.n,c.m = a.n;
    for(int i=1;i<=a.n;i++)c.mat[i][i] = 1;

    while(k){
        if(k&1){
            c = c*a;
        }
        a = a*a;
        k>>=1;
    }
    return c;
}
void out(Mat a){
    for(int i=1;i<=a.n;i++){
        for(int j=1;j<=a.m;j++){
            printf(j==a.m? "%I64d\n":"%I64d ",a.mat[i][j]);
        }
    }
}
LL quickPow(LL x, LL n, LL mm)
{
    LL a = 1;
    while (n)
    {
        a *= n&1 ? x : 1;
        a %= mm;
        n >>= 1 ;
        x *= x;
        x %= mm;
    }
    return a;
}
int main()
{

    int T_T;
    scanf("%d",&T_T);
    MOD=1024;
    Mat pp;
    pp.n=pp.m=2;
    pp.mat[1][1]=5;
    pp.mat[1][2]=12;
    pp.mat[2][1]=2;
    pp.mat[2][2]=5;

    while(T_T--){
        scanf("%d",&n);
        Mat ans=pp^(n-1);
        LL out=(ans.mat[1][1]*5+ans.mat[1][2]*2)%MOD;
        printf("%I64d\n",(2*out-1+MOD)%MOD);
    }
    return 0;
}


/*
                   _ooOoo_
                  o8888888o
                  88" . "88
                  (| -_- |)
                  O\  =  /O
               ____/`---'\____
             .'  \\|     |//  `.
            /  \\|||  :  |||//  \
           /  _||||| -:- |||||-  \
           |   | \\\  -  /// |   |
           | \_|  ''\---/''  |   |
           \  .-\__  `-`  ___/-. /
         ___`. .'  /--.--\  `. . __
      ."" '<  `.___\_<|>_/___.'  >'"".
     | | :  `- \`.;`\ _ /`;.`/ - ` : | |
     \  \ `-.   \_ __\ /__ _/   .-` /  /
======`-.____`-.___\_____/___.-`____.-'======
                   `=---='
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
         I have a dream!A AC deram!!
 orz orz orz orz orz orz orz orz orz orz orz
 orz orz orz orz orz orz orz orz orz orz orz
 orz orz orz orz orz orz orz orz orz orz orz

*/

版权声明:本文为博主原创文章,未经博主允许不得转载。

HDU 2256 Problem of Precision(矩阵快速幂)

题目地址:HDU 2256 思路: (sqrt(2)+sqrt(3))^2*n=(5+2*sqrt(6))^n; 这时要注意到(5+2*sqrt(6))^n总可以表示成an+bn*sqrt(6)...

HDU 2256 Problem of Precision (矩阵快速幂)

HDU 2256 A Simple Math Problem (矩阵快速幂) ACM 题目地址:HDU 2256 Problem of Precision 题意:  给出一个式子,求值。 分析...
  • hcbbt
  • hcbbt
  • 2014年08月04日 00:21
  • 1951

HDU 2256 Problem of Precision(矩阵快速幂 数论 )

HDU 2256 Problem of Precision(矩阵快速幂 数论 )

HDU 2256 Problem of Precision(矩阵快速幂入门题)

Problem Description   Input The first line of input gives the number of cases, T. T...

HDU 2256 Problem of Precision 解题报告(矩阵快速幂 + 构造)

Problem of Precision Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot...
  • kbdwo
  • kbdwo
  • 2014年04月30日 11:46
  • 508

【矩阵快速幂-求平方根表达式的值】HDU Problem of Precision 2256

Problem of Precision Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot...
  • ydd97
  • ydd97
  • 2015年09月20日 21:23
  • 457

hdoj 2256 Problem of Precision 【矩阵快速幂】【构建矩阵好题】

Problem of Precision Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth...

hdu5451(矩阵快速幂+广义斐波拉契)

题目链接:hdu5451 题目大意:已知,给你整数x,和一个素数M,求[y]%M。 题目分析: 设 (5+2√6)n=Xn+Yn*√6 Xn+Yn*√6 =(...

矩阵快速幂 求斐波拉切数列的第n项 poj3070

Fibonacci Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7241 ...

hdu 2256 Problem of Precision 矩阵

#include #include #include #include #include using namespace std; #define LL long long const in...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hdu2256Problem of Precision+矩阵快速幂+广义斐波拉契
举报原因:
原因补充:

(最多只允许输入30个字)