在jxzz上发现的一个做题网站,每周都有训练题,题目质量……前三题比较水,后面好神啊,而且类型差不多,这周似乎是计数专题……

 

Army Game

【hackerrank】Week of Code 26

然后给出n*m,问需要多少个小红点能全部占领

解法:乘法。。。

 

Best Divisor

给一个数,问一个数的约数中数字和最大的约数。

解法:直接分解质因数就可以啦。

 

Twins

孪生质数定义为两个质数之差为2,问n,m之间有多少个孪生质数(n<=m<=10^9,m-n<=10^6)

解法:显然直接判断区间内相邻的两个奇数是否为质数就可以啦。然而n和m比较大,所以判断是否为质数不能直接用sqrt(n)这样去枚举,可以先用线性筛处理出sqrt(n)的质数,判断的时候直接枚举质数表里面的质数就可以啦。

 1 1 #include<cstdio>
 2  2 #include<cstring>
 3  3 #include<cstdlib>
 4  4 #include<queue>
 5  5 #include<algorithm>
 6  6 #include<stack>
 7  7 #include<cmath>
 8  8 #include<map>
 9  9 #define LL long long 
10 10 #define maxn 1000100
11 11 
12 12 
13 13 using namespace std;
14 14 
15 15 int n,m,now,sum,prime[maxn],ok[maxn],tot=0;
16 16 void calc()
17 17 {
18 18     int i,k;
19 19     for (i=2;i<maxn;i++) {
20 20         if (!ok[i]) prime[tot++]=i;
21 21         for (LL j=(LL)(i)*prime[k=0];j<maxn;j=i*prime[++k]) {
22 22         //    printf("%lld %d\n",j,i);
23 23             ok[j]=1;
24 24             if (!(i%prime[k])) break;
25 25         }
26 26     }
27 27 //    for (int i=0;i<tot;i++) printf("\t%d",prime[i]); 
28 28 }
29 29 
30 30 int check(int x)
31 31 {
32 32     if (x==1) return 0;
33 33     for (int i=0;i<tot && prime[i]<=sqrt(x);i++) 
34 34         if (!(x%prime[i])) return 0;
35 35     return 1;
36 36 } 
37 37 
38 38 int main()
39 39 {
40 40     calc();
41 41     scanf("%d %d",&n,&m);
42 42     now=0,sum=0;
43 43     if (!(n%2)) n++;
44 44     for (int i=n;i<=m;i=i+2) 
45 45         if (check(i)) {
46 46             if (now) ++sum;
47 47             else ++now;
48 48         }
49 49         else
50 50             now=0;
51 51     printf("%d\n",sum);
52 52     return 0;
53 53 }
View Code

相关文章: