[Luogu2359] 三素数数
题目背景
蛟川书院的一道练习题QAQ
题目描述
如果一个数的所有连续三位数字都是大于100的素数,则该数称为三素数数。比如113797是一个6位的三素数数。
输入输出格式
输入格式:一个整数n(3 ≤ n ≤ 10000),表示三素数数的位数。
输出格式:一个整数,表示n位三素数的个数m,要求输出m除以10^9 + 9的余数。
输入输出样例
说明
区域动归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; }