CodeForces 588B
题意:在n的因子中找出一个最大的因子,这个因子的因子中不能出现平方数
题解:在O(sqrt(n))找出因子a,由于任何大于1的数可以写成素数的形式,所以只要枚举小余sqrt(a)的素数平方是否为a的因子。
#include <iostream> #include <cstring> #include <cmath> using namespace std; long long p[80000]; bool vis[1000000]; void prim(int n) { int m=sqrt(n+0.5); memset(vis,0,sizeof(vis)); for(int i=2;i<=m;i++) if(!vis[i]) for(int j=i*i;j<=n;j+=i) vis[j]=1; int ans=0; for(int i=2;i<=n;i++) if(!vis[i]) p[ans++]=i; // for(int i=0;i<ans;i++) // cout<<p[i]<<endl; // cout<<ans<<endl;78499 } int solve(long long n) { long long temp=sqrt(n+0.5); bool ok=1; for(long long i=0;p[i]<=temp;i++) { //cout<<n<<' '<<p[i]<<endl; long long p2=p[i]*p[i]; if(n%p2==0) { ok=0; break; } } if(ok) return 1; return 0; } int main() { prim(1000001); long long n; cin>>n; long long temp=sqrt(n+0.5); long long so=1; for(long long i=1;i<=temp;i++) { if(n%i==0) { if(solve(n/i) && n/i>so) so=n/i; if(solve(i) && i>so) so=i; } } cout<<so<<endl; return 0; }