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 }