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

Posted Shawn_Ji

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了随笔—邀请赛前练—CodeForces 588B相关的知识,希望对你有一定的参考价值。

题意:给一个数,求最大的一个因子,这个因子还要满足不能有平方数是他的因子。

我的解法几乎是暴力的,应该可以用数学的方法不暴力(或者说不那么“暴力”)求出来。

我的解法是:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<set>

using namespace std;

#define  MAX(x,y) (((x)>(y)) ? (x) : (y))
#define  MIN(x,y) (((x) < (y)) ? (x) : (y))
#define ABS(x) ((x)>0?(x):-(x))

const long long inf = 0x7fffffff;
const long long N=1000000+10;
long long a[N];

bool check(long long x)
{
    for(long long i=2; i*i<=x; i++){
        if(x%(i*i) ==0){
            return 0;
        }
    }
    return 1;
}

int main()
{
    long long n;
    cin>>n;
    long long p=0;
    for(long long i=1; i*i<=n; i++){
//        cout<<i<<endl;
        if(n%i == 0){
                a[p++]=i;
                a[p++]=n/i;
        }
    }
    sort(a,a+p);
    for(long long i=p-1; i>=0; i--){
        if( check(a[i])){
            printf("%I64d\\n",a[i]);
            break;
        }
    }
View Code

后来在网上学习了质因子分解的解法。  思路是从2开始,一个个试因子,并且把n中的i因子抽离干,进行到n==1或者i*i>n 。

代码

#include<iostream>
using namespace std;

int main()
{
    long long n;
    cin>>n;
    long long ans=1;
    for(long long i=2; i*i<=n; i++){
        if(n==1)    break;
        if(n%i == 0)    
            ans *= i;
        while(n%i == 0){
            n /= i;
        }
    }
    cout<<ans*n<<endl;
    return 0;
}
View Code

 

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

CodeForces 588B

CodeForces 588B

随笔—邀请赛前训—Codeforces Round #328 (Div. 2) A. PawnChess

随笔—邀请赛前训—Codeforces Round #327 (Div. 2) Rebranding

随笔—邀请赛前训— Codeforces Round #330 (Div. 2) Vitaly and Night

随笔—邀请赛前训—Codeforces Round #330 (Div. 2) B题