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

hdu 2604 Queuing(矩阵快速幂乘法)

2015-12-11 19:35 441 查看
[align=left]Problem Description[/align]

Queues and Priority Queues are data structures which are known to most computer scientists. The Queue occurs often in our daily life. There are many people lined up at the lunch time.


#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<math.h>
#include<algorithm>
#include<queue>
#include<set>
#include<bitset>
#include<map>
#include<vector>
#include<stdlib.h>
#include <stack>
using namespace std;
#define PI acos(-1.0)
#define max(a,b) (a) > (b) ? (a) : (b)
#define min(a,b) (a) < (b) ? (a) : (b)
#define ll long long
#define eps 1e-10
#define MOD 1000000007
#define N 1000006
#define inf 1e12
int L,M;
struct Matrix{
int mp[4][4];
};
Matrix Mul(Matrix a,Matrix b){
Matrix res;
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
res.mp[i][j]=0;
for(int k=0;k<4;k++){
res.mp[i][j]=(res.mp[i][j]+(a.mp[i][k]*b.mp[k][j])%M+M)%M;
}
}
}
return res;
}
Matrix fastm(Matrix a,int b){
Matrix res;
memset(res.mp,0,sizeof(res.mp));
for(int i=0;i<4;i++){
res.mp[i][i]=1;
}
while(b){
if(b&1){
res=Mul(res,a);
}
a=Mul(a,a);
b>>=1;
}
return res;
}
int main()
{
while(scanf("%d%d",&L,&M)==2){

if(L==1){
printf("%d\n",2%M);
continue;
}
if(L==2){
printf("%d\n",2%M);
continue;
}
if(L==3){
printf("%d\n",6%M);
continue;
}
if(L==4){
printf("%d\n",9%M);
continue;
}

Matrix tmp;
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
tmp.mp[i][j]=0;
}
}

tmp.mp[0][0]=1;
tmp.mp[0][2]=1;
tmp.mp[0][3]=1;
tmp.mp[1][0]=1;
tmp.mp[2][1]=1;
tmp.mp[3][2]=1;
Matrix cnt=fastm(tmp,L-4);

Matrix g;
g.mp[0][0]=9;
g.mp[1][0]=6;
g.mp[2][0]=4;
g.mp[3][0]=2;
cnt=Mul(cnt,g);
printf("%d\n",cnt.mp[0][0]%M);
}

return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: