• 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 }
  • 相关阅读:
    保留字段数组,一定要用char
    VirtualBox安装CentOS 7及其相关配置
    istringstream是支持>>一个bool的,但为什么不用?
    用vector实现一个变长数组
    C语言为什么被const声明的变量不是一个常量表达式
    不咬文嚼字的理由
    int变量赋值给char变量的本质
    #include <> 和 #include "" 的区别
    C++中匿名对象应当是一个左值
    js实战之-间断文字滑动
  • 原文地址:https://www.cnblogs.com/fightfordream/p/6407401.html
Copyright © 2020-2023  润新知