在jxzz上发现的一个做题网站,每周都有训练题,题目质量……前三题比较水,后面好神啊,而且类型差不多,这周似乎是计数专题……
Army Game
然后给出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 }