您的位置:首页 > 产品设计 > UI/UE

hdu 5950 Recursive sequence(递推 快速幂矩阵)

2017-11-04 21:34 274 查看
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5950

参考自:http://blog.csdn.net/spring371327/article/details/52973534



#include<bits/stdc++.h>
using namespace std;

typedef long long int ll;
const ll mod = 2147493647;

//定义矩阵乘法
struct matrix{
ll arr[7][7];
matrix operator*(matrix b){
matrix ans;
ll tmp;
for(int i=0; i<7; i++)
for(int j=0; j<7; j++){
ans.arr[i][j] = 0;
for(int k=0; k<7; k++){
tmp = (arr[i][k]*b.arr[k][j])%mod;
ans.arr[i][j] = (ans.arr[i][j] + tmp)%mod;
}
}
return ans;
}
};

//矩阵快速幂
matrix quick_pow(matrix a,ll N){
matrix ans;
memset(ans.arr,0,sizeof(ans.arr));
for(int i=0; i<7; i++)
ans.arr[i][i] = 1;
while(N){
if(N&1)
ans = ans*a;
a = a*a;
N /= 2;;
}
return ans;
}
int main(){
matrix a;
memset(a.arr,0,sizeof(a.arr));
int tmp[7][7]={{0,1,0,0,0,0,0},
{2,1,1,4,6,4,1},
{0,0,1,4,6,4,1},
{0,0,0,1,3,3,1},
{0,0,0,0,1,2,1},
{0,0,0,0,0,1,1},
{0,0,0,0,0,0,1}};
for(int i=0;i<7;i++)for(int j=0;j<7;j++) a.arr[i][j]=tmp[i][j];
int T;
scanf("%d",&T);
ll N,aa,bb;
while(T--){
scanf("%lld%lld%lld",&N,&aa,&bb);
if(N==1)
printf("%lld\n",aa);
else if(N==2)
printf("%lld\n",bb);
else{
matrix ans = quick_pow(a,N-2);
ll ANS = 0;
ANS = (ANS+ans.arr[1][0]*aa)%mod;
ANS = (ANS+ans.arr[1][1]*bb)%mod;
ANS = (ANS+ans.arr[1][2]*16)%mod;
ANS = (ANS+ans.arr[1][3]*8)%mod;
ANS = (ANS+ans.arr[1][4]*4)%mod;
ANS = (ANS+ans.arr[1][5]*2)%mod;
ANS = (ANS+ans.arr[1][6]*1)%mod;
printf("%lld\n",ANS);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: