HDOJ 2604 Queuing
这个也是矩阵2分快速幂
但是重点是找出规律来就好做了
即:f(n)=f(n-1)+f(n-3)+f(n-4)
#include<iostream>
#include<stdio.h>
#include<cmath>
using namespace std;
struct aa
{
int a[4][4];
void init()
{
a[0][0]=a[0][2]=a[0][3]=a[1][0]=a[2][1]=a[3][2]=1;
a[0][1]=a[1][1]=a[1][2]=a[1][3]=a[2][0]=a[2][2]=a[2][3]=a[3][0]=a[3][1]=a[3][3]=0;
}
};
int mod;
aa f(aa m,aa n)
{
aa ans;
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
{
ans.a[i][j]=0;
for(int k=0;k<4;k++)
ans.a[i][j]+=m.a[i][k]*n.a[k][j];
ans.a[i][j]%=mod;
}
return ans;
}
aa mul(aa m,long k)
{
aa ans;
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
ans.a[i][j]=(i==j);
while(k)
{
if(k&1)
{
ans=f(ans,m);
}
k>>=1;
m=f(m,m);
}
return ans;
}
int main()
{
long n,sum;
while(scanf("%d%d",&n,&mod)!=EOF)
{
aa p,ans;
sum=0;
p.init();
if(n==0)
sum=0;
else
if(n==1)
sum=2;
else if(n==2)
sum=4;
else if(n==3)
sum=6;
else if(n==4)
sum=9;
else
{
ans=mul(p,n-4);
sum=ans.a[0][0]*9+ans.a[0][1]*6+ans.a[0][2]*4+ans.a[0][3]*2;
}
printf("%d\n",sum%mod);
}
return 0;
}

浙公网安备 33010602011771号