正常程序
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1.5e7+5;
const int INF = MAXN+100;
int n, cnt, maxx, answer;
int a[300005];
bool isPrime[MAXN+100];
int GCD;
int eqNum[MAXN];
int gcd(int a, int b){
if (a<b) swap(a, b);
return b==0 ? a : gcd(b, a%b);
}
void getPrime(){
memset(isPrime, 1, sizeof(isPrime));
for (int i=2; i<=MAXN; i++){
int cnt = 0;
if (isPrime[i]) {
for (int j=i; j<MAXN; j+=i){
isPrime[j] = 0;
cnt += eqNum[j];
}
}
//cout<<cnt<<endl;
if (answer == -1) {
printf("before i = %d\n", i);
return;
}
answer = min(answer, n-cnt);
if (answer == -1) {
printf("after i = %d\n", i);
return;
}
}
}
int main(){
scanf("%d", &n);
answer = INF;
for (int i=0; i<n; i++){
scanf("%d", &a[i]);
GCD = gcd(GCD, a[i]);
}
//printf("gcd = %d\n", GCD);
for (int i=0; i<n; i++){
eqNum[a[i]/GCD]++;
}
//printf("%d", eqNum[4]);
getPrime();
if (answer == INF || answer == n) cout<<-1<<endl;
else cout<<answer<<endl;
}
爆炸程序
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1.5e7+5;
const int INF = MAXN+100;
int n, cnt, maxx, answer;
int a[300005];
bool isPrime[MAXN+100];
int GCD;
int eqNum[MAXN];
int gcd(int a, int b){
if (a<b) swap(a, b);
return b==0 ? a : gcd(b, a%b);
}
void getPrime(){
memset(isPrime, 1, sizeof(isPrime));
for (int i=2; i<=MAXN; i++){
int cnt = 0;
if (isPrime[i]) {
for (int j=i; j<=MAXN; j+=i){
isPrime[j] = 0;
cnt += eqNum[j];
}
}
//cout<<cnt<<endl;
if (answer == -1) {
printf("before i = %d\n", i);
return;
}
answer = min(answer, n-cnt);
if (answer == -1) {
printf("after i = %d\n", i);
return;
}
}
}
int main(){
scanf("%d", &n);
answer = INF;
for (int i=0; i<n; i++){
scanf("%d", &a[i]);
GCD = gcd(GCD, a[i]);
}
//printf("gcd = %d\n", GCD);
for (int i=0; i<n; i++){
eqNum[a[i]/GCD]++;
}
//printf("%d", eqNum[4]);
getPrime();
if (answer == INF || answer == n) cout<<-1<<endl;
else cout<<answer<<endl;
}
数组越界 OSX正常 CF测评机报错 查了半天啊-。-。-。-。-。-。-