Index of super-prime - SGU 116(素数+背包)

题目大意:素数表2,3,5,7,11.....如果一个素数所在的位置还是素数,那么这个素数就是超级素数,比如3在第2位置,那么3就是超级素数.....现在给你一个数,求出来这个数由最少的超级素数的和组成,输出这个超级素数。

分析:因为给的数字并不大,所以直接用完全背包求出来即可。

代码如下:

=================================================================================================================================

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;

const int MAXN = 10007;
const int oo = 1e9+7;

int sup[MAXN], cnt;
int dp[MAXN];

void superPrime()
{
    bool used[MAXN]={1,1};
    cnt = 0;

    for(int k=0,i=2; i<MAXN; i++)
    {
        if(!used[i])
        {
            k++;
            if(used[k] == 0)
                sup[++cnt] = i;
            for(int j=i+i; j<MAXN; j+=i)
                used[j] = true;
        }
    }
}

int main()
{
    superPrime();

    int N, from[MAXN];

    scanf("%d", &N);

    for(int i=1; i<=N; i++)
        dp[i] = oo;

    for(int i=1; i<=cnt; i++)
    for(int j=sup[i]; j<=N; j++)
    {
        if(dp[j-sup[i]]+1 < dp[j])
        {
            dp[j] = dp[j-sup[i]]+1;
            from[j] = j-sup[i];
        }
    }

    if(dp[N] == oo)
        printf("0\n");
    else
    {
        printf("%d\n", dp[N]);
        for(int i=N; i!=0; i=from[i])
        {
            printf("%d%c", i-from[i], from[i]?‘ ‘:‘\n‘);
        }
    }

    return 0;
}
时间: 2024-10-05 14:23:40

Index of super-prime - SGU 116(素数+背包)的相关文章

SGU 116

简单DP,可以理解为背包问题的变式.(想当初苯渣会错题意,以为只要输出任意一组解啊!结果一趟DFS在第14个点上WA三次啊!TUT) (第14个点上WA的一定是用贪心或一趟DFS做的!) 首先找到10000以内的super_prime,共201个.(不是打表- -) 这部分代码可以在行到行找到. 然后DP:f[i]代表用最少SUPER_PRIME构成i的数目,prev[i]保存序列. f[i]=f[i-super[j]]+1(如果super[j]<=i,1<=j<=201) #inclu

POJ1811 Prime Test(miller素数判断&amp;&amp;pollar_rho大数分解)

http://blog.csdn.net/shiyuankongbu/article/details/9202373 发现自己原来的那份模板是有问题的,而且竟然找不出是哪里的问题,所以就用了上面的链接上的一份代码,下面只是寄存一下这份代码,以后打印出来当模板好了. #pragma warning(disable:4996) #include <iostream> #include <cstring> #include <algorithm> #include <c

POJ 3126 Prime Path(素数路径)

p.MsoNormal { margin-bottom: 10.0000pt; font-family: Tahoma; font-size: 11.0000pt } h1 { margin-top: 5.0000pt; margin-bottom: 5.0000pt; text-align: left; font-family: 宋体; font-weight: bold; font-size: 24.0000pt } span.10 { font-family: "Times New Rom

Light OJ 1356 Prime Independence 最大独立集+素数筛选

题目来源:Light OJ 1356 Prime Independence 题意:给你n个数 选出最多的数构成一个集合使得任何2个数不是另外一个数的质数倍 x!=k*y 思路:矛盾的2个数连边 并且所有数分成质因子数为奇数和偶数两部分 以质因子奇偶不同构建二分图 同奇或者同偶的数一定不是另外一个数的质数倍 判断矛盾 首先对每个数因子分解 例如x 有a1个p1质因子 a2个p2质因子...an个pn质因子 x的质因子个数为a1+a2+...+an 记为sum 判断是否存在x/p1  x/p2 ..

SGU 116 Index of super-prime 数论+完全背包+输出方案

题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=116 题意好晦涩 给你一个不超过一万的数 问它最少可以用多少个“超级素数”来表示 使“超级素数”之和等于它 如果无法这样表示 输出0 否则 按非降序形式输出方案 数论部分就模板的问题 没什么说的 完全背包方面也很常规 说说[输出方案] 背包九讲的伪码给的是二维dp[]的方法 实际上稍加改动就可以用在一维数组上 用一个rec[]记录dp[]的当前状态是从哪个状态转移而来(即上一个状态) 通过

SGU[116] Index of super-prime

Description 描述 Let P1, P2, … ,PN, … be a sequence of prime numbers. Super-prime number is such a prime number that its current number in prime numbers sequence is a prime number too. For example, 3 is a super-prime number, but 7 is not. Index of supe

POJ 2689 Prime Distance(素数区间筛法--经典题)

大致题意:给定[L,R]区间,找出区间内的每个素数 数据范围 : 1<=L< R<=2,147,483,647) R-L <=1,000,000. R的数值太大,所以不能直接筛[0,R]的,要空间和时间优化,用到区间筛法,另外注意不能用int,因为R和L都是满int的,中间有很多细节处理会爆int的,还要注意1不是素数,所以在区间筛中要特判一下,是个易错的地方 //1160K 16MS C++ 1539B #include<cstdio> #include<ios

hdu5108Alexandra and Prime Numbers(素数的性质)

题目链接: huangjing 思路:每一个数都可以表示成若干个素数的乘积,那么可以对N从2一直枚举到sqrt(N),然后对每个数都能除到不能取余为止,那么后面的合数就不会除了,所以最后得到的数就是最大的质因子,然后直接N/最大的质因子,还有就是N=1的时候没有存在的数  . 题目: Alexandra and Prime Numbers Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth

POJ 2739 Sum of Consecutive Prime Numbers(素数打表水题)

[题意简述]:题意很简单,就是用连续的素数加和,计算有多少个这样的连续的素数数列可以使这个序列的和等于输入的数. [分析]:很经典的素数模板,基本所有有关素数的题,我都会使用这个模板. // 268K 16Ms #include<iostream> using namespace std; #define N 10000 bool isprime[N]; long long prime[1300],nprime; // 注意long long void doprime() { long lon