2020年2月2日 ICPC2019徐州 现场赛C <3 numbers 思维题

问因数<3的数个数,是否小于给定区间1/3。因数<3除了1以外等价于素数。

据说杜教筛改成求素数前缀和的版本可以暴力做,但是并不会。

我们一个直观感受是,素数是越来越稀疏的,打表发现,50以外长度30以上,一定满足。而长度不到30的,用根号算法暴力判断每个元素即可。

注意要以乘代除,或者起码除double......

 1 #include <cstdio>
 2 #include <cmath>
 3 using namespace std;
 4 int T,l,r;
 5 bool check(int x)
 6 {
 7     if (x == 1)
 8         return true;
 9     if (x == 2)
10         return true;
11     if (x == 3)
12         return true;
13     int t = sqrt(x);
14     for (int i = 2;i <= t;i++)
15         if (x % i == 0)
16             return false;
17     return true; 
18 }
19 int main()
20 {
21     for (scanf("%d",&T);T;T--)
22     {
23         scanf("%d%d",&l,&r);
24         int cnt = 0;
25         if (r - l <= 30 || r <= 50)
26         {
27             for (int i = l;i <= r;i++)
28                 if (check(i))
29                 {
30                     cnt++;
31                     if (3 * cnt >= r - l + 1)
32                         break;
33                 }
34             if (3 * cnt >= r - l + 1)
35                 printf("No\n");
36             else
37                 printf("Yes\n");
38         }else
39             printf("Yes\n");
40     }    
41     return 0;
42 }

 

posted @ 2020-02-02 17:17  IAT14  阅读(430)  评论(0编辑  收藏  举报