UVALIve 5987 素数

题目链接:Distinct Primes

如果一个数。至少有三个因子是素数、。那么这个数就是prime num.30和42是前两个prime num.问你第n个这种数是谁。(1<=n<=1000)。

用质因子分解。判断每个数有多少个因子是质数。如果超过3个旧记录下来、记录前1000个。

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

typedef long long ll;
#define N 5000
int isprime[N];
ll prime[N], nprime,  factor[N], numfactor[N], ct;

void makeprime()  // 打出1到N的素数表。
{
    int i, j, temp;
    nprime = 0;
    memset(isprime, 1, sizeof(isprime));
    isprime[1] = 1;
    temp = sqrt(N+0.0);
    for (i=2; i<=temp; ++i)
    {
        if (isprime[i])
        {
            for (j=i+i; j<N; j+=i)
            {
                isprime[j] = 0;
            }
        }
    }
    for (int i=1; i<N; ++i)
    {
        if (isprime[i]) prime[nprime++] = i;
    }
}

int divide(int n)  // 对n进行质因子分解。ct表示质因子的个数、
{
    int i;
    int temp = sqrt(n+0.0);
    ct = 0;
    memset(numfactor, 0, sizeof(numfactor));
    for (i=1; i<=nprime; ++i)
    {
        if (prime[i] > temp) break;
        if (n % prime[i] == 0)
        {
            factor[++ct] = prime[i];
            while(n % prime[i] == 0)
            {
                n /= prime[i];
            }
        }
    }
    if (n != 1)
    {
        factor[++ct] = n;
    }
    return ct;
}

int main()
{
    int num[1001], cnt = 0;
    makeprime();
    for (int i=1; ; ++i)
    {
        if (divide(i) >= 3) num[cnt++] = i;
        if (cnt > 1000) break;
    }
    int t, n;
    cin >> t;
    while(t--)
    {
        cin >> n;
        cout << num[n-1] << endl;
    }
    return 0;
}

时间: 2024-10-03 03:08:09

UVALIve 5987 素数的相关文章

2015暑假训练赛个人赛(8.19)

    ID Origin Title 二分+dp 22 / 89 Problem A UVALive 5983 MAGRID 枚举 19 / 44 Problem B UVALive 5984 Save the Students! ? 1 / 1 Problem C UVALive 5985 Robbing Gringotts ? 38 / 117 Problem D UVALive 5986 Wizarding Duel 预处理前2000个数 65 / 127 Problem E UVALi

uvalive 6396 数论 世界决赛的题

https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&category=589&problem=4407&mosmsg=Submission+received+with+ID+1528513 Factors The fundamental theorem of arithmetic states that every integer

数论-素数

    素数定义: 质数(prime number)又称素数,有无限个.质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数,这样的数称为质数.例 子:2.3.5.7.11.13.17.19. 素数一些性质: 质数p的约数只有两个:1和p: 任一大于1的自然数,要么本身是质数,要么可以分解为几个质数之积,这种分解是唯一的: 一个偶数可以写成两个合数之和,其中每一个合数都最多只有9个质因数: 一个偶数必定可以写成一个质数加上一个合成数,其中合数的因子个数有上界: 素数应用: 数学上来看,

素数判断BFS之“Prime Path”

题目大意: 给两个素数 a ,b ,在(1033 -- 8179)之间(左闭右闭).询问将 a 变成 b 的最短步数. 找不到输出  Impossible  . 每次只能改变一个数字,千位数字不能出现 0 .而且每次一步改变后的数仍然为素数. 样例: 3 1033 8179 1373 8017 1033 1033 -------- 6 7 0 解释其中第一个样例: 1033  -->  1733  -->  3733  -->  3739  -->  3779  -->  8

素数测试算法(基于Miller-Rabin的MC算法) // Fermat素数测试法

在以往判断一个数n是不是素数时,我们都是采用i从2到sqrt(n)能否整除n.如果能整除,则n是合数;否则是素数.但是该算法的时间复杂度为O(sqrt(n)),当n较大时,时间性能很差,特别是在网络安全和密码学上一般都是需要很大的素数.而从目前来看,确定性算法判断素数的性能都不好,所以可以用MC概率算法来解决,其中Miller Rabin算法就是其中的很经典的解决方法.下面首先介绍下相关的数学理论. 数学原理 Fermat小定理:若n是素数,则对所有1≤a≤n-1的整数a,有a^(n-1)mod

177. 有限制的素数

177. [USACO Jan07] 有限制的素数 ★   输入文件:qprime.in   输出文件:qprime.out   简单对比 时间限制:1 s   内存限制:128 MB Farmer John 开始给奶牛们标记上素数的牌子,贝茜注意到了这一切,她对各种数的牌子很好奇. 请帮助贝茜算出从A到B (1 ≤ A ≤ B ≤ 4,000,000; B ≤ A + 1,000,000; B ≤ A + 2,000,000 ),其中包含数字D的素数的个数. 素数是只有两个两个约数(1 和 它

素数应用

输入一个数 分解尾三个数想乘 如果三个数其中有两个为素数->yes 否则no 1 //素数升级 2 //功能:??已知N是正整数,?它可拆写成三个正整数N1.N2和N3之和的形式N=N1+N2+N3.? 3 //请编程序打印出满足上式的全部组合,并当N1.N2和N3中至少有两个是素数时打印"YES"否则打印"NO".? 4 //如N = 5时输出:? 5 //5 = 1 + 1 + 3?????NO? 6 //5 = 1 + 2 + 2?????YES? 7

尝试用filter()函数删除1~100的素数

题目来自"廖雪峰的官方网站--Python教程",尝试用filter()函数删除1~100的素数: def is_prime(n):     if n <= 1:         return False     for s in range(2,n):         if n % s == 0:             return False     return True      print filter(is_prime,range(1,101) 素数的定义: 质数(

今天练习了一下用python写函数,就把它记录到博客上吧 冒泡排序和素数判断

第一个是判断素数,先上代码吧: 1 from math import sqrt 2 def is_prime(i): 3 if i == 2: 4 return True 5 elif i<2: 6 return False 7 elif i%2 == 0: 8 return False 9 else: 10 for n in range(3,int(sqrt(i)+1),2): 11 if i%n == 0: 12 return False 13 return True 这里用到了math包的