题目描述:
如果一个数任意相邻两位均是质数,我们称之为 大蒜数。最小的大蒜数是两位数 11。蒜头君想知道 K 位数的大蒜数有多少个。
输入:
输入为 1 个整数 K, (2≤K≤1000)。
输出:
输出为 1 个整数,为 K 位数的大蒜数的个数,结果对 10007 取模。
输出时每行末尾的多余空格,不影响答案正确性
思路:
dp[i][j] 表示长度 i 以 j 结尾的方案数,则递推关系为:dp[i][j] = sum(dp[i-1][n])
其中,保证 10*n+j 为质数。初始条件为 dp[1][1-9] 的值为 1
代码:
#include <iostream>
using namespace std;
int ans=0, k;
int dp[1010][10]; //dp[i][j] 表示长度 i 以 j 结尾的方案数,dp[i][j] = sum(dp[i-1][n])
//其中,保证 10*n+j 为质数。初始条件为 dp[1][1-9] 的值为 1
bool isPrime(int n)
{
for (int i=2;i*i<=n;i++)
{
if (n%i==0)
{
return false;
}
}
return true;
}
int main()
{
cin>>k;
for(int i=1;i<=9;i++)
{
dp[1][i]=1;
}
for(int i=2;i<=k;i++)
{
for(int j=1;j<=9;j++)
{
for(int n=1;n<=9;n++)
{
if (isPrime(10*n+j))
{
dp[i][j]+=dp[i-1][n];
dp[i][j]%=10007;
}
}
}
}
for (int i=1;i<=9;i++)
{
ans+=dp[k][i];
ans%=10007;
}
cout<<ans<<endl;
return 0;
}