超简单题4
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
构造矩阵:a,c两字母的两种状态互相组合存在4中状态;构造4*4的矩阵;
题目描述
ACM界有一种变异的字符串,长度为N,仅由a,b,c,d四个字母组成,其中a和c在字符串中必须为偶数个(也可以不出现),请计算出满足条件的字符串的个数。
输入
多组输入,每组输入N(1 <= N < 2^63),表示字符串的长度
输出
每组一行,输出字符串的个数(由于数据较大,只需输出最后两位)
示例输入
1 2
示例输出
2 6
提示
来源
示例程序
#include <iostream>
#include<bits/stdc++.h>
#define LL long long
using namespace std;
struct Matrix
{
int x,y;
LL A[4][4];
void Clean()
{
x=y=0;
memset(A,0,sizeof(A));
}
Matrix operator *(const Matrix& B)const
{
Matrix tmp;
tmp.Clean();
tmp.x=x,tmp.y=B.y;
for(int i=0;i<x;i++)
{
for(int j=0;j<B.y;j++)
{
for(int k=0;k<x;k++)
{
(tmp.A[i][j]+=A[i][k]*B.A[k][j])%=100;
}
}
}
return tmp;
}
}C,S;
void init()
{
C.Clean();
C.x=4;C.y=1;
C.A[0][0]=2;C.A[1][0]=1;C.A[2][0]=1;C.A[3][0]=0;
S.Clean();
S.x=S.y=4;
S.A[0][0]=2;S.A[0][1]=1;S.A[0][2]=1;S.A[0][3]=0;
S.A[1][0]=1;S.A[1][1]=2;S.A[1][2]=0;S.A[1][3]=1;
S.A[2][0]=1;S.A[2][1]=0;S.A[2][2]=2;S.A[2][3]=1;
S.A[3][0]=0;S.A[3][1]=1;S.A[3][2]=1;S.A[3][3]=2;
}
LL power(LL n)
{
Matrix ans,tmp;
ans=C,tmp=S;
while(n)
{
if(n&1)
ans=tmp*ans;
n>>=1;
tmp=tmp*tmp;
}
// for(int i=0;i<4;i++)
// {
// printf("%d\n",ans.A[i][0]);
// }
return ans.A[0][0]%100;
}
int main()
{
init();
LL n;
while(cin>>n)
{
if(n==1)
printf("2\n");
else
printf("%lld\n",power(n-1));
}
return 0;
}