poj 3070(矩阵快速幂入门)

题目:http://poj.org/problem?id=3070

代码:

#include<iostream>
#include<algorithm>
using namespace std;
const int mod=10000;
struct matrix
{
    int m[2][2];
}ans,base;//这里用一个结构体数组不知道省了多少代码

//base数组记入的是矩阵的2^x次幂 

matrix multi(matrix a,matrix b)//返回的是结构体里的东西我们就要用 结构体来写类型 
{
    matrix tem;//临时写的关于结构体的一个数组 用作中间过渡用 
    for(int i=0;i<2;i++)
    for(int j=0;j<2;j++)
    {
        tem.m[i][j]=0;// 初始化 
        for(int k=0;k<2;k++)
        {
            tem.m[i][j]=(tem.m[i][j]+a.m[i][k]*b.m[k][j])%mod;//把你算的东西存入tem里 
        }
    }
    return tem;//返回的就是你这一次作乘法的结果 
}

int fast_mod(int n)
{
    base.m[0][0]=base.m[0][1]=base.m[1][0]=1;//题目里写的矩阵 
    base.m[1][1]=0;
    ans.m[0][0]=ans.m[1][1]=1;//这个是一个单位矩阵 
    ans.m[1][0]=ans.m[0][1]=0;
    while(n)
    {
        if(n&1)//表示n为奇数的情况 
        {
            ans=multi(ans,base);
        }
        base=multi(base,base);
        n>>=1;//每次除2 
        
    }
    return ans.m[0][1];
}
int main()
{
    long long n;
    while(scanf("%lld",&n)!=EOF&&n!=-1)
    {
        printf("%d\n",fast_mod(n));
    }
    return 0;
    
 } 

猜你喜欢

转载自www.cnblogs.com/2000liuwei/p/10851734.html