zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    java 线程 Lock 锁使用Condition实现线程的等待(await)与通知(signal)
    A计划(三维dfs)
    最少拦截系统(线性dp)
    疯狂的采药(完全背包)
    Modular Inverse (拓展欧几里得求逆元)
    斐波那契数列的3种求法及几种素数筛法
    Magic Odd Square (思维+构造)
    Marlin (思维)
    qdu_组队训练(ABCFIJK)
    2018蓝桥编程题6-9+ 50%的10
  • 原文地址:https://www.cnblogs.com/fightfordream/p/6407401.html
Copyright © 2011-2022 走看看