• Ural 2070:Interesting Numbers(思维)


    http://acm.timus.ru/problem.aspx?space=1&num=2070

    题意:A认为如果某个数为质数的话,该数字是有趣的。B认为如果某个数它分解得到的因子数目是素数的话,那么该数字是有趣的。

    现在问[L,R]里面有多少个数是同时满足这两个条件或者同时不满足这两个条件的数。

    简化题意就是,用[L,R]里面的总数 - 是一个合数并且其因子数是素数的数目。

    一开始想,如果是平方的话,那么因子数必定是一个奇数,但是奇数里面的素数要怎么找就不知道了。想到后面离正解越走越远。

    正解是这样的:假设p是一个素数,对于p^k,如果k+1是一个素数的话,那么p^k的因子数就是一个素数。

    找规律:4 = 2^2的因子:1、2、4。

    8 = 2^3的因子:1、2、4、8。

    16 = 2^4的因子:1、2、4、8、16。

    从这三个例子可以发现对于一个p^k,其因子数为k+1。举3、5、7等例子也是一样的结果。

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 #define N 1000010
     4 typedef long long LL;
     5 int num, prime[N], is[N];
     6 // 一个数是素数的k次方并且k+1是素数
     7 
     8 void biao() {
     9     int n = 1000000;
    10     for(int i = 1; i <= n; i++) is[i] = 1;
    11     is[0] = is[1] = num = 0;
    12     for(int i = 2; i <= n; i++) {
    13         if(!is[i]) continue;
    14         prime[++num] = i;
    15         for(int j = 2 * i; j <= n; j += i) 
    16             is[j] = 0;
    17     }
    18 }
    19 
    20 LL solve(LL n) {
    21     LL sum, cnt = 0;
    22     for(int i = 1; i <= num; i++) {
    23         sum = prime[i];
    24         int q = 1;
    25         while(true) {
    26             q++; sum *= prime[i];
    27             if(sum > n) break;
    28             if(is[q + 1]) cnt++;
    29         }
    30     }
    31     return n - cnt;
    32 }
    33 
    34 int main() {
    35     LL L, R; biao();
    36     while(cin >> L >> R) cout << solve(R) - solve(L - 1) << endl;
    37     return 0;
    38 }
  • 相关阅读:
    HDU 3068 最长回文
    UVa 1377 / LA 3667 Ruler
    HDU 1540 Tunnel Warfare
    POJ 3450 Corporate Identity
    外贸网站成功运营五个要点
    SEO白帽必备孙子兵法之三十六计
    修改zencart模版的相关资料
    怎么做友情链接,PR值即将更新之际 教你10招快速提升PR值到4
    基于zencart搭建外贸网站流程
    网站内链优化需要考虑的方面
  • 原文地址:https://www.cnblogs.com/fightfordream/p/6407401.html
Copyright © 2020-2023  润新知