标签:dp
http://acm.timus.ru/problem.aspx?space=1&num=1586
题意没看懂,看了别人的翻译。threeprime number的意思是任意三个连续的数组成的一个三位数是素数,注意必须是三位数。给出n,问满足条件的n位数有多少个。
先把三位数的素数筛选出来并标记,设dp[i][j][k]表示到i位为止,最后两位是j和k的满足条件的数的个数。
那么dp[i][j][k] += dp[i-1][g][j]。
#include <stdio.h> #include <iostream> #include <map> #include <set> #include <list> #include <stack> #include <vector> #include <math.h> #include <string.h> #include <queue> #include <string> #include <stdlib.h> #include <algorithm> #define LL __int64 #define eps 1e-12 #define PI acos(-1.0) #define PP pair<LL,LL> using namespace std; const int INF = 0x3f3f3f3f; const int maxn = 1000; const int mod = 1000000009; int prime[maxn+10]; int flag[maxn+10]; int cnt = 0; int tprime[maxn+10]; int dp[10010][12][12]; void get_prime() { memset(flag,0,sizeof(flag)); prime[0] = 0; flag[0] = flag[1] = 1; for(int i = 2; i <= maxn; i++) { if(flag[i] == 0) { prime[++prime[0]] = i; if(i >= 100 && i <= 999) tprime[++cnt] = i; } for(int j = 1; j <= prime[0] && i*prime[j] <= maxn; j++) { flag[prime[j]*i] = 1; if(i % prime[j] == 0) break; } } } int main() { get_prime(); int n; while(~scanf("%d",&n)) { if(n == 3) { printf("%d\n",cnt); continue; } memset(dp,0,sizeof(dp)); for(int i = 1; i <= cnt; i++) { int b = tprime[i]%10; int a = tprime[i]/10%10; dp[3][a][b] += 1; } for(int i = 4; i <= n; i++) { for(int j = 0; j <= 9; j++) { for(int k = 0; k <= 9; k++) { for(int g = 0; g <= 9; g++) { int num = j*100 + k*10 + g; if(flag[num] == 0 && num >= 100) //num必须是三位数 { dp[i][k][g] += dp[i-1][j][k]%mod; dp[i][k][g] %= mod; } } } } } LL ans = 0; for(int i = 0; i <= 9; i++) { for(int j = 0; j <= 9; j++) ans = (ans + dp[n][i][j])%mod; } printf("%I64d\n",ans); } return 0; }
标签:dp
原文地址:http://blog.csdn.net/u013081425/article/details/38824791