ural Threeprime Numbers(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;
}
时间: 2024-08-29 02:48:09

ural Threeprime Numbers(dp)的相关文章

递推DP URAL 1586 Threeprime Numbers

题目传送门 1 /* 2 题意:n位数字,任意连续的三位数字组成的数字是素数,这样的n位数有多少个 3 最优子结构:考虑3位数的数字,可以枚举出来,第4位是和第3位,第2位组成的数字判断是否是素数 4 所以,dp[i][j][k] 表示i位数字,最高位数字j,第二高位数字k 5 状态转移方程:dp[i][j][k] += dp[i-1][k][l] 6 注意:最高位从1开始枚举:) 7 详细解释:http://blog.csdn.net/zhangyanxing666/article/detai

URAL1586——DP——Threeprime Numbers

Description Rest at the sea is wonderful! However, programmer Pasha became awfully bored of lying on a beach in Turkey; so bored that he decided to count the quantity of three-digit prime numbers. This turned out to be so interesting that he then sta

hdu 4722 Good Numbers(dp)

public static void main(String[] args) { String a=null; if("aa".equals(a))//这种情形,不出现空指针异常 //if(a.equals("aa"))//出现空指针异常 { System.out.println(true); } else { System.out.println(false); } } 上面的两句不同的比较语句测试,第一句不出现空指针异常,第二句出现. 所以在变量和常量比较的时候

HDU 1058 Humble Numbers (dp+打表)

先是想筛法素数表啊,然后1~2000000000枚举打表啊,结果越想越不对. 后来想到唯一分解定理,可是怎么实现呢..果然还是需要努力啊.. 研究了discuss代码,码之~ ~~~~ dp的思想,若dp[i]是Humble Numbers,那么dp[i]*2,dp[i]*3,dp[i]*5,dp[i]*7都将是Humble Numbers. 所以只需要注意连续性便好了. #include<cstdio> #include<algorithm> #include<cmath&

Ural 1586 Threeprime Numbers(DP)

题目地址:Ural 1586 先定义一个prime三维数组来记录素数,若i*100+j*10+k为素数,则标记prime[i][j][k]为1,否则为0.这样对后面的处理很方便. 然后定义一个dp三维数组,dp[n][i][j]表示当前n位的十位数字为i,个位数字为j时的素数个数,这时候状态要从prime[k][i][j]为素数时转移过来,所以状态转移方程为: if(prime[j][k][h])         dp[i][k][h]+=dp[i-1][j][k] 代码如下: #include

URAL 1586. Threeprime Numbers 数位dp

题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1586 题解:dp[i][j][k]表示长度为i,最高位为j,次高位为k的合法方案数,转移方程为当j*100+k*10+l为质数时dp[i][j][k]+=dp[i-1][k][l]; #include<bits/stdc++.h> #include<set> #include<iostream> #include<string> #include&

ural 1009. K-based Numbers dp 高精度

点击打开链接 1009. K-based Numbers Time limit: 1.0 second Memory limit: 64 MB Let's consider K-based numbers, containing exactly N digits. We define a number to be valid if itsK-based notation doesn't contain two successive zeros. For example: 1010230 is a

URAL 1244 Gentlement DP +记录路径 好题

1244. Gentlemen Time limit: 0.5 secondMemory limit: 64 MB Let's remember one old joke: Once a gentleman said to another gentleman:— What if we play cards?— You know, I haven't played cards for ten years…— And I haven't played for fifteen years…So, li

ural 1039 树dp

http://acm.timus.ru/problem.aspx?space=1&num=1039 1039. Anniversary Party Time limit: 0.5 secondMemory limit: 8 MB Background The president of the Ural State University is going to make an 80'th Anniversary party. The university has a hierarchical st