完整代码:(如果数组大小没有开够给出的可能是WA的结果)
#include <cstdio>#include <cstring>#include <algorithm>#include <iostream>#include <cmath>using namespace std;const int maxm = 3e5+5;const int maxn = 1.5e7+5;int a[maxm+5],vis[maxn+5],p[maxn+5],s[maxn+5];int cnt;int gcd(int x,int y){ return y? gcd(y,x%y) : x;}//欧拉筛void init(){ int i ,j; cnt = 0; memset(vis,0,sizeof(0)); vis[0] = vis[1] = 1; for(i=2;i<=maxn;++i) { if(!vis[i]) vis[i]= p[cnt++]= i; for(j=0;j<cnt&&i*p[j]<=maxm;++j){ vis[i*p[j]] = p[j];//vis[i+p[j]] = 1; if(i%p[j]==0) break; } }}int main(){ int n,i,j,g,x,ans; init(); scanf("%d",&n); g = 0; for(i=1;i<=n;++i) { scanf("%d",&a[i]); g = gcd(g,a[i]); } ans = 0; for(i =1;i<=n;i++){ a[i]/= g;//所有a[i]除以共同gcd(然后记录所有因子个数) for(j = 0;p[j]*p[j] <= a[i];j++){ int q = p[j]; if(a[i]%q ==0) s[q]++; while(a[i]%q==0){ a[i] /= q; } } if(a[i] != 1) s[a[i]]++; } ans = n; for(int i=2; i<maxn; ++i){ ans = min(ans, n-s[i]); } if(ans == n) ans = -1; printf("%d\n", ans); return 0;}
转载于:https://www.cnblogs.com/Tianwell/p/11320374.html
相关资源:JAVA上百实例源码以及开源项目