先在字典树中插入禁止序列11,123456,22,33,44,55,66,654321,然后构造矩阵,快速求幂,累计答案,看出模型的话,就跟POJ2778是一样的题目
代码:
#include<iostream>
#include<memory.h>
#include<string>
#include<cstdio>
#include<algorithm>
#include<math.h>
#include<stack>
#include<queue>
using namespace std;
#define M 112233
struct node
{
int id,next[7],fail;
bool danger;
}trie[1000];
int n,m,index;
char s[8][10]={"11","123456","22","33","44","55","66","654321"};
__int64 mat[24][24],a[24][24],base[24][24];
void insert(char str[])
{
int i=0,del,p=0;
while(str[i])
{
del=str[i]-'0';
if(trie[p].next[del]==-1)
{
trie[p].next[del]=++index;
trie[index].fail=-1;
trie[index].id=index;
trie[index].danger=false;
memset(trie[index].next,-1,sizeof(trie[0].next));
}
p=trie[p].next[del];
i++;
}
trie[p].danger=true;
}
void build_fail()
{
int fa,pre,i;
queue<int>q;
q.push(0);
while(!q.empty())
{
fa=q.front();
q.pop();
for(i=1;i<=6;i++)
{
if(trie[fa].next[i]!=-1)
{
pre=trie[fa].fail;
while(pre!=-1)
{
if(trie[pre].next[i]!=-1)
{
trie[trie[fa].next[i]].fail=trie[pre].next[i];
break;
}
pre=trie[pre].fail;
}
if(pre==-1)
trie[trie[fa].next[i]].fail=0;
q.push(trie[fa].next[i]);
}
}
}
}
bool is_dangerous(int x)
{
while(x!=0)
{
if(trie[x].danger)
return true;
x=trie[x].fail;
}
return false;
}
int transfer(int i,int j)
{
while(i!=-1)
{
if(trie[i].next[j]!=-1)
return trie[i].next[j];
i=trie[i].fail;
}
return 0;
}
void build_matrix()
{
int i,j,k;
memset(mat,0,sizeof(mat));
for(i=0;i<=index;i++)
{
if(is_dangerous(i))
continue;
for(j=1;j<=6;j++)
{
k=transfer(i,j);
if(is_dangerous(k))
continue;
else
base[i][k]++;
}
}
}
void copy()
{
for(int i=0;i<24;i++)
for(int j=0;j<24;j++)
mat[i][j]=base[i][j];
}
void mul(__int64 x[24][24],__int64 y[24][24])
{
__int64 b[24][24],tmp;
for(int i=0;i<=index;i++)
{
for(int j=0;j<=index;j++)
{
tmp=0;
for(int k=0;k<=index;k++)
{
tmp+=x[i][k]*y[k][j];
if(tmp>=M)
tmp-=M;
}
b[i][j]=tmp%M;
}
}
for(int i=0;i<=index;i++)
for(int j=0;j<=index;j++)
x[i][j]=b[i][j];
}
void cal()
{
int i,j,k;
memset(a,0,sizeof(a));
for(i=0;i<=index;i++)
{
a[i][i]=1;
}
while(n)
{
if(n&1)
{
mul(a,mat);
}
mul(mat,mat);
n>>=1;
}
}
int main()
{
int i,j;
index=0;
trie[0].id=0;
trie[0].fail=-1;
memset(trie[0].next,-1,sizeof(trie[0].next));
trie[0].danger=false;
for(i=0;i<8;i++)
insert(s[i]);
build_fail();
build_matrix();
while(scanf("%I64d",&n)!=EOF)
{
if(n%2==0)
{
puts("0");
continue;
}
n=n/2+1;
copy();
cal();
__int64 ans=0;
for(i=0;i<=index;i++)
{
ans+=a[0][i];
if(ans>=M)
ans%=M;
}
cout<<ans<<endl;
}
return 0;
}