码迷,mamicode.com
首页 > 其他好文 > 详细

FZU 1683

时间:2014-07-21 08:07:13      阅读:221      评论:0      收藏:0      [点我收藏+]

标签:os   io   for   re   c   amp   

矩阵的快速幂

sn     1 1 0 0  sn-1

fn+1  = 0 3 2 7*  fn

fn     0 1 0 0  fn-1

fn-1    0 0 1 0   fn-2

 

 

#include <iostream>
#include <string.h>
using namespace std;
int n;
struct M{
    int t[4][4];
    M(){
        memset(t,0,sizeof(t));
    }
    void init(){
        t[0][0]=t[0][1]=t[2][1]=t[3][2]=1;
        t[1][1]=3;
        t[1][2]=2;
        t[1][3]=7;
    }
    void E(){
        for(int i=0;i<4;i++){
            t[i][i]=1;
        }
    }
};
M multiply(M a,M b){
    M c;
    for(int i=0;i<4;i++){
        for(int j=0;j<4;j++){
            for(int k=0;k<4;k++){
                c.t[i][j]=(c.t[i][j]+a.t[i][k]*b.t[k][j])%2009;
            }
        }
    }
    return c;
}
M powM(M a,int k){
    M tem;
    tem.E();
    while(k){
        if(k&1)tem=multiply(a,tem);
        a=multiply(a,a);
        k>>=1;
    }
    return tem;
}
int main(){
    int t;
    cin>>t;
    M a,b,c;
    a.t[0][0]=4;
    a.t[1][0]=5;
    a.t[2][0]=3;
    a.t[3][0]=1;
    b.init();
    for(int i=1;i<=t;i++){
        cin>>n;
        cout<<"Case "<<i<<": ";
        if(n==0)cout<<"1\n";
        else {
            c=powM(b,n-1);
            c=multiply(c,a);
            cout<<c.t[0][0]<<endl;
        }

    }
    return 0;
}

FZU 1683,布布扣,bubuko.com

FZU 1683

标签:os   io   for   re   c   amp   

原文地址:http://www.cnblogs.com/Mr-Xu-JH/p/3857484.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!