• [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;
    }
  • 相关阅读:
    Centos7下永久修改mysql5.6最大连接数
    关于Linux fontconfig 字体库的坑
    回收maven私仓过期垃圾数据
    conda python虚拟环境
    小程序分享H5页面
    会看以前的邮箱
    快乐的小程序
    和运营开会的知道的一些点
    V-Distpicker不能完整显示内容
    VUE随手记坑
  • 原文地址:https://www.cnblogs.com/BriMon/p/9622460.html
Copyright © 2020-2023  润新知