D. Two Divisors
筛法
我发现了,这种题还是挺容易卡时间的
要多用筛法防止超时
这题就是一个简单的质因数分解。
如果当前的数有至少两个质因数的话
那么就ok否则就no
#include<iostream> #include<algorithm> using namespace std; typedef pair<int,int> pii; const int max_n = 5e5+100; const int max_m = 1e7+100; pii ans[max_n]; int n; int isprime[max_m]; int prime[max_m]; int main(){ fill(prime,prime+max_m,-1); for (int i=2;i<=10000000;++i){ if (isprime[i]!=0)continue; for (int j=i+i;j<=10000000;j+=i){ isprime[j]++; prime[j]=i; } } scanf("%d",&n); for (int i=1;i<=n;++i){ int num;scanf("%d",&num); if (isprime[num]<2)ans[i]=pii(-1,-1); else { int f = prime[num]; while (num%f==0)num/=f; ans[i]=pii(f,num); } } for (int i=1;i<=n;++i)printf("%d ",ans[i].first);printf("\n"); for (int i=1;i<=n;++i)printf("%d ",ans[i].second); }