Threeprime Numbers

46 篇文章 1 订阅

1586. Threeprime Numbers

Time limit: 1.0 second
Memory limit: 64 MB
Rest at the sea is wonderful! However, programmer Pasha became awfully bored of lying on a beach in Turkey; so bored that he decided to count the quantity of three-digit prime numbers. This turned out to be so interesting that he then started to study threeprime numbers. Pasha calls an integer a threeprime number if any three consecutive digits of this integer form a three-digit prime number. Pasha had already started working on the theory of the divine origin of such numbers when some vandals poured water on Pasha and cried some incomprehensible words like “Sonnenstich!”, “Colpo di sole!”, and “Coup de soleil!”
You are to continue Pasha’s work and find out how often (or rare) threeprime numbers are.

Input

The input contains an integer  n (3 ≤  n ≤ 10000).

Output

Output the quantity of  n-digit threeprime numbers calculated modulo 10 9 + 9.

Sample

input output
4
204

/**DP = =!**/
/**思路:用dp[j][k]表示位数时,最后两位是k,且满足题目要求的数字的个数**/
#include<iostream>
#include<cstring>
#include<cstdio>

using namespace std;
#define maxn 10010
#define mod 1000000009

bool prim[1010];
long long dp[maxn][100];
int n;

void deal()//求出100~1000内的素数,并初始化dp[3]
{
    prim[2]=0;
    for(int i=2;i<1000;i++)
        if(!prim[i])
        {
            for(int k=2
                ;i*k<1000;k++)
            prim[k*i]=1;
            if(i>=100)
                dp[3][i%100]++;
        }
}

void read()
{
    scanf("%d",&n);
}

void DP()
{
    deal();
    for(int i=4;i<=n;i++)
    {
        for(int j=10;j<100;j++)//枚举i位数字最后两位的值
            for(int k=10;k<100;k++)//枚举i-1位数字最后两位的值
                if(!prim[j%10+k*10]&&j/10==k%10)/**如果i位数字最后两位的值和i-1位最后一位的值构成素数,且i位数字倒数第二位数字等于i-1
                    位最后一位的数字**/
                {
                    dp[i][j]+=dp[i-1][k];//状态转移
                    dp[i][j]%=mod;//注意取余
                }
    }
    long long ans=0;
    for(int i=0;i<100;i++)
    {
        ans+=dp[n][i];
        ans%=mod;
    }
    printf("%lld\n",ans);
}

int main()
{
    read();
    DP();
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值