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;
}

浙公网安备 33010602011771号