[Luogu2359] 三素数数

题目背景

蛟川书院的一道练习题QAQ

题目描述

如果一个数的所有连续三位数字都是大于100的素数,则该数称为三素数数。比如113797是一个6位的三素数数。

输入输出格式

输入格式:

一个整数n(3 ≤ n ≤ 10000),表示三素数数的位数。

输出格式:

一个整数,表示n位三素数的个数m,要求输出m除以10^9 + 9的余数。

输入输出样例

输入样例#1: 复制
4
输出样例#1: 复制
204

说明

区域动归QAQ

 


 

 

设$f[i][j]$表示i位,最后两位是j的方案数。

可以预处理出来素数, 然后推出$f[3][x]$。

之后递推式子  $\large f[i][j mod 100] = f[i][j mod 100] + f[i-1][j/10]$。

 


 

 

 

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cstdlib>
using namespace std;
#define reg register 
inline int read() {
    int res = 0;char ch=getchar();bool fu=0;
    while(!isdigit(ch)) {if(ch=='-')fu=1;ch=getchar();}
    while(isdigit(ch)) res=(res<<3)+(res<<1)+(ch^48), ch=getchar();
    return fu?-res:res;
}
#define mod 1000000009
int prime[1000], cnt;
bool is[1005];
int n;
int f[10005][100];
int ans;

int main()
{
    n = read();
    for (reg int i = 2 ; i <= 999 ; i ++) 
    {
        if (!is[i]) prime[++cnt] = i;
        for (reg int j = 1 ; j <= cnt and i * prime[j] <= 999 ; j ++)
        {
            is[i*prime[j]] = 1;
            if (i % prime[j] == 0) break;
        }
    }
    for (reg int i = 1 ; i <= cnt ; i ++)
        if (prime[i] >= 100) f[3][prime[i]%100]++;
    for (reg int i = 4 ; i <= n ; i ++)
        for (reg int j = 1 ; j <= cnt ; j ++)
            if (prime[j] >= 100) f[i][prime[j]%100] = (f[i][prime[j]%100] + f[i-1][prime[j]/10]) %mod;
    for (reg int i = 1 ; i <= 99 ; i ++)
        ans = (ans + f[n][i]) % mod;
    cout << ans << endl;
    return 0;
}

 

 

 

posted @ 2018-09-10 20:10  zZhBr  阅读(226)  评论(0编辑  收藏  举报