最小的数

最小的数

Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other)
Total Submission(s) : 29   Accepted Submission(s) : 16

Font: Times New Roman | Verdana | Georgia

Font Size: ← →

Problem Description

Input

本题只有唯一一组测试数据,第一行给出N,q,表示K的个数以及q次询问。1<=N<=1000,q<=10^5.
接下来q行每行一个正整数(64位整数范围内),请判断其对10^9+7取余后,是否在集合K中。

Output

对于每次询问,根据题意输出Yes或No

Sample Input

3 3
2
6
33

Sample Output

Yes
Yes
No


这题并不难,可是一开始的数组被我开太大了,就没反应过来了,用一个 set就过了。
 1 #include <iostream>  
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cmath>
 5 #include <set>
 6 #include <algorithm>
 7 #define  ll long long int
 8 #define Ma 1000000007
 9 #define N 10005
10 using namespace std;
11 ll prime[N],p[N];
12 int n,m,k=0;
13 set<ll> s;
14 void IsPrime() {
15     memset(prime, 0, sizeof(prime));
16     prime[0] = prime[1] = 1;
17     for (int i = 2; i < N; i++){
18         if (!prime[i]) {
19             p[++k] = i;
20             for (int j = 2; j * i < N; j++)
21                 prime[i * j] = 1;
22         }
23     }
24 }
25 
26 int main(){
27 
28     scanf("%d%d",&n,&m);
29     IsPrime();
30     for(int i=1;i<=n;i++){
31         ll ans=1;
32         for(int j=1;j<=i;j++){
33             ans=p[j]*ans%Ma;
34         }
35         s.insert(ans);
36     }
37     while(m--){
38      ll h;
39         scanf("%lld",&h);
40 
41         if(s.count(h)){
42             printf("Yes
");
43         }else{
44             printf("No
");
45         }
46     }
47     return 0;
48 }


原文地址:https://www.cnblogs.com/zllwxm123/p/7260270.html