CodeForces 588B

Posted 猫哥小俊

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
}

 

以上是关于CodeForces 588B的主要内容,如果未能解决你的问题,请参考以下文章

随笔—邀请赛前练—CodeForces 588B

[Codeforces Round #522 (Div. 2, based on Technocup 2019 Elimination Round 3)][C. Playing Piano](代码片段

c_cpp Codeforces片段

Codeforces 86C Genetic engineering(AC自动机+DP)

CodeForces 1005D Polycarp and Div 3(思维贪心dp)

(Incomplete) Codeforces 394 (Div 2 only)