Solution - P2359 三素数数

好水的题……

思路

一道裸的数位 DP。先把 \(100 \sim 999\) 的质数打出来,然后注意到一个三素数数中每两个素数有两位重叠,于是 DP 即可。

记得开滚动数组。

代码

#include <bits/stdc++.h>
#define rint register int
#define rllong register long long
#define llong long long
#define N 10004
const int mod = 1e9+9;
using namespace std;

int prime[N], cnt;
llong dp[2][105], ans;
int n;

inline bool is_prime(rint x){
	for(rint i = 2; i*i <= x; ++i)
		if(x % i == 0) return false;
	return true;
}

int main(){
	scanf("%d", &n);
	for(rint i = 101; i <= 999; ++i)
		if(is_prime(i)) prime[++cnt] = i;
	for(rint i = 10; i <= 99; ++i)
		dp[0][i] = 1;
	for(rint i = 3; i <= n; ++i){
		rint lt = i&1^1, nt = i&1;
		for(rint j = 1; j <= 99; ++j)
			dp[nt][j] = 0;
		for(rint j = 1; j <= cnt; ++j)
			dp[nt][prime[j]%100] = (dp[nt][prime[j]%100]+dp[lt][prime[j]/10])%mod;
	}
	for(rint i = 1; i <= 99; ++i)
		ans = (ans+dp[n&1][i])%mod;
	printf("%lld", ans%mod);
	return 0;
}

posted @ 2025-04-20 13:51  Hootime  阅读(11)  评论(0)    收藏  举报