LightOj 1096 - nth Term (矩阵快速幂,简单)

题目

 

 

 

这道题是很简单的矩阵快速幂,可惜,在队内比赛时我不知什么时候抽风把模版中二分时判断的 ==1改成了==0 ,明明觉得自己想得没错,却一直过不了案例,唉,苦逼的比赛状态真让人抓狂!!!

 

 

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;

int num,mod;
struct matrix
{
    int a[4][4];
};

matrix multiply(matrix x,matrix y)//矩阵乘法
{
       matrix temp;
       for(int i=0;i<num;i++)
       {
               for(int j=0;j<num;j++)
               {
                       int ans=0;
                       for(int k=0;k<num;k++)
                       {
                               ans+=((x.a[i][k]*y.a[k][j])%mod);
                       }
                       temp.a[i][j]=ans%mod;
               }
       }
       return temp;
}

matrix calc(matrix origin ,matrix answ,int n)//n次矩阵快速幂
{
     while(n)
     {
             if(n%2==1)//原来比赛时一直是这里被我不小心改成了0,怪不得案例一直都过不了
                    answ=multiply(origin,answ);
             origin=multiply(origin,origin);
             n/=2;
     }
     return answ;
}

int main()
{
    int a,b,n,c,t;
    scanf("%d",&t);
    for(int id=1;id<=t;id++)
    {
        num=4;mod=10007;
        scanf("%d%d%d%d",&n,&a,&b,&c);
        matrix origin={1,0,0,0,
                        0,0,1,0,
                        0,0,0,1,
                        c,b,0,a};
        matrix answ={1,0,0,0,
                    0,0,0,0,
                    0,0,0,0,
                    0,0,0,0};
        answ=calc(origin,answ,n-2);
        printf("Case %d: %d\n",id,answ.a[3][0]);
    }
    return 0;

}
View Code

 

posted @ 2014-02-20 20:34  laiba2004  Views(290)  Comments(0Edit  收藏  举报