题意:
求有多少个n位数符合:任意连续三位组成的三位数都是素数;边看边想。
分析:
dp水,状态转移的初始情况从是三位数的素数:pr[i][j][k]开始,
转移到第4、5、6......t.....n位,转移条件pr[i][j][k]==1,dp[t][i][j]+=dp[t-1][j][k]
dp[t][i][j]表示t位数,第一位是i,第二位是j时,有多少种素数的情况,
它是由dp[t-1][j][k]转移过来的。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <vector>
#include <queue>
#include <map>
#include <limits.h>
using namespace std;
typedef long long ll;
#define mod 1000000009
int pr[11][11][11];
int dp[10005][11][11];
bool prime(int n)
{
int i;
if(n==1||n==2)return false;
for(i=2;i*i<=n;i++)
{
if(n%i==0)
return false;
}
return true;
}
int main()
{
int n;
while(~scanf("%d",&n))
{
int i,j,k,t,cnt=0;
memset(dp,0,sizeof(dp));
for(i=1;i<=9;i++)
for(j=0;j<=9;j++)
for(k=0;k<=9;k++)
if(prime(i*100+j*10+k))
{
pr[i][j][k]=1;
dp[3][i][j]++;
}
for(t=4;t<=n;t++)
{
for(i=1;i<=9;i++)
{
for(j=0;j<=9;j++)
{
for(k=0;k<=9;k++)
{
if(pr[i][j][k])
dp[t][i][j]=(dp[t][i][j]+dp[t-1][j][k])%mod;
}
}
}
}
int ans=0;
for(i=1;i<=9;i++)
{
for(j=0;j<=9;j++)
ans=(ans+dp[n][i][j])%mod;
}
printf("%d\n",ans);
}
return 0;
}