zoukankan      html  css  js  c++  java
  • UVA 10539

    Almost prime numbers are the non-prime numbers which are divisible by only a single prime number.
    In this problem your job is to write a program which finds out the number of almost prime numbers
    within a certain range.
    Input
    First line of the input file contains an integer N (N ≤ 600) which indicates how many sets of inputs
    are there. Each of the next N lines make a single set of input. Each set contains two integer numbers
    low and high (0 < low ≤ high < 1012).
    Output
    For each line of input except the first line you should produce one line of output. This line contains
    a single integer, which indicates how many almost prime numbers are within the range (inclusive)
    low . . . high.
    Sample Input
    3
    1 10
    1 20
    1 5
    Sample Output
    3
    4
    1

    题意:给你 一个范围 a,b,找出这个范围中 满足 x = p^k (p为素数,k > 1)  的数的个数

    题解: ab,范围是10的12次方 我们找出1e6内的素数 ,打表出所有可能形成 的数去重排序 ,每次二分找下标就好了

           ans(b) - ans(a-1)就是答案

    #include <iostream>
    #include <cstdio>
    #include <cmath>
    #include <cstring>
    #include <algorithm>
    #include<vector>
    using namespace std ;
    typedef long long ll;
    
    const int N=1000000;
    ll a, b, prime[N + 2], now[N+2];
    int H[N + 2], cnt, scc;
    void prime_table() {
        cnt = 0;
        H[1] = 1;
        for(int i = 2; i <= N ; i++) {
            if(!H[i]) {
                for(int j = i + i ; j <= N ; j += i) H[j] = 1;
                prime[++cnt] = i;
            }
        }
        scc = 0;
        for(int i = 1 ; i <= cnt ; i++) {
            for(ll j = prime[i] * prime[i] ; j <= 1e12 ; j *= prime[i]) {
                now[scc++] = j;
            }
        }
        sort(now, now + scc);
        scc = unique(now,now + scc) - now ;
    }
    ll solve(ll x) {
        ll ans = upper_bound(now,now + scc,x) - now;
        return ans;
    }
    int main() {
        prime_table();
        int T;
        scanf("%d",&T);
        while(T--) {
            scanf("%lld%lld",&a,&b);
            ll ans = solve(b) - solve(a-1);
            printf("%lld
    ", ans);
        }
        return 0;
    }
    代码
  • 相关阅读:
    linux下解压命令大全
    关于一个订单多商品如何发表评价的问题
    浏览器通知
    简易时钟
    微信小程序地图控件篇 自定义图标被地图覆盖的问题
    面向对象拖拽
    elementUI的Dialog弹出框蒙版被遮住
    面向对象轮播图
    高内聚低耦合
    苦逼程序员
  • 原文地址:https://www.cnblogs.com/zxhl/p/5113413.html
Copyright © 2011-2022 走看看