题目链接
题目就是找每个数的最小素因子,然后递归除,本来没啥问题,结果今天又学习了个新坑点。
我交了题后,疯狂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 */
原文地址:https://www.cnblogs.com/wangwangyu/p/9690486.html
时间: 2024-11-09 00:47:52