【个人模板】 快速幂取模,矩阵快速幂,快速乘

#include<bits/stdc++.h>  
using namespace std;  
const int MOD = 1007;  
int xx(int a,int n,int MOD) //计算a的n次方对MOD取模  
{  
    int ret=1;  
    int tmp=a%MOD;  
    while(n)  
    {  
        if(n&1)  
            ret=ret*tmp%MOD;  
        tmp=tmp*tmp%MOD;  
        n>>=1;  
    }  
    return ret;  
}  
int main()  
{  
    int m,n;  
    while(scanf("%d%d",&m,&n)==2)  
    {  
        printf("%d\n",xx(m,n,MOD));  
    }  
}  
#include <bits/stdc++.h>  
using namespace std;  
const int N = 4 ;  
int n;  
struct xx  
{  
    int a[N][N];  
} ori,res;  
xx mul(xx x,xx y)  
{  
    xx temp;  
    memset(temp.a,0,sizeof(temp.a));  
    for(int i=0; i<N; i++)  
    {  
        for(int j=0; j<N; j++)  
        {  
            for(int k=0; k<N; k++)  
            {  
                temp.a[i][j]+=x.a[i][k]*y.a[k][j];  
            }  
        }  
    }  
    return temp;  
}  
void init()  
{  
    int x;  
    for(int i=0; i<N; i++)  
    {  
        for(int j=0; j<N; j++)  
        {  
            scanf("%d",&x);  
            ori.a[i][j]=x;  
        }  
    }  
    for(int i=0; i<N; i++)  
    {  
        for(int j=0; j<N; j++)  
        {  
            res.a[i][j]=i==j?1:0;  
        }  
    }  
}  
xx calc(long long k)                                            
{  
    while(k)  
    {  
        if(k%2==1)                      ///这么写比普通的快速幂好,亲身体会,HDU 5667用普通写法 TLE,这么写就过了  
        {  
            res=mul(ori,res);           
            k-=1;  
        }  
        else  
        {  
            ori=mul(ori,ori);  
            k/=2;  
        }  
    }  
    return res.a[0][0];  
}  
int main()  
{  
    while(cin>>n)  
    {  
        init();  
        calc(n);  
    }  
}  

long long mul(long long a,long long b)    
{    
    long long res=0;    
    while(b)    
    {    
        if(b&1) res=(a+res)%Mod;    
        b>>=1;    
        a=(a+a)%Mod;    
    }    
    return res;    
}    


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值