Codeforces Round #511 (Div. 2) C. Enlarge GCD

题目链接

题目就是找每个数的最小素因子,然后递归除,本来没啥问题,结果今天又学习了个新坑点。

我交了题后,疯狂CE,我以为爆内存,结果是,我对全局数组赋值,

 

如果直接赋值,会直接在exe内产生内存,否则只会在运行时才分配内存。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 const int maxn = 1e7 + 5e6 + 10;
 5 
 6 //线性素数筛
 7 int prime[2000000],num_prime = 0;
 8 int vis[maxn];
 9 void is_prime(int N)
10 {
11     for(int i=2;i<N;i++)
12     {
13         if(!vis[i])
14         {
15             prime[num_prime++] = i;
16             vis[i] = i;
17         }
18         for(int j=0;j<num_prime&&i*prime[j]<N;j++)
19         {
20             vis[i*prime[j]] = prime[j];
21             if(!(i%prime[j]))
22             {
23                 break;
24             }
25         }
26     }
27     return;
28 }
29 int a[300010];
30 int fp[maxn];
31 
32 int main()
33 {
34     int n; scanf("%d", &n);
35     for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
36     int g = a[1];
37     for(int i = 2; i <= n; i++) g = __gcd(g, a[i]);
38     for(int i = 1; i <= n; i++) a[i] /= g;
39     memset(fp, 0, sizeof(fp));
40     is_prime(maxn);
41     int maxlen = 0;
42     for(int i = 1; i <= n; i++)
43     {
44         while(a[i] > 1)
45         {
46             fp[vis[a[i]]]++;
47             maxlen = max(maxlen, fp[vis[a[i]]]);
48             int tmp = vis[a[i]];
49             while(a[i] % tmp == 0)
50             {
51                 a[i] = a[i] / tmp;
52             }
53             if(a[i] == 1) break;
54         }
55     }
56     if(maxlen == 0) printf("-1\n");
57     else printf("%d\n", n - maxlen);
58     return 0;
59 }
60 /*
61 4
62 18 27 45 30
63 */

猜你喜欢

转载自www.cnblogs.com/wangwangyu/p/9690486.html