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;
}

 

posted on 2016-05-25 09:38  猫哥小俊  阅读(217)  评论(0编辑  收藏  举报

导航