随笔—邀请赛前练—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;
        }
    }

后来在网上学习了质因子分解的解法。  思路是从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;
}

时间: 2024-10-29 19:09:51

随笔—邀请赛前练—CodeForces 588B的相关文章

随笔—邀请赛前练— Codeforces Round #329 (Div. 2) 2Char

题意:给你多个字符串,只保留2及2个以内的字符,丢弃多余的字符串,问你最后留下的字符串最长能有多长? 思路: 1. 对每个字符串处理出  process[fir][sec]  只包含fir字符和sec字符 当前的最大长度.当然,超过2个字符的字符串自动跳过. 2. 注意合并 process[fir][sec].process[sec][fir].process[fir][0].process[sec][0] 3. 合并的过程还要注意特殊情况 process[fir][0] + process[s

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

题意:一个字符串,做n次变换,每次变换是把a字符与b字符全部调换.求全部调换完成后的字符串. 这道题目我一开始理解错意思了,理解成将所有a字符变成b字符,我觉得这样出貌似还更有挑战性一点..口亨 #include<cstdio> #include<cstring> #include<map> #include<iostream> using namespace std; #define MAX(x,y) (((x)>(y)) ? (x) : (y))

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

题意:给你一个8×8的棋盘分布,红黑棋子,双方只能朝上下其中一个方向移动,不可跨越对方或自己的棋子,最先到对面底部的人赢.问谁赢? 思路:上下2排同时开始扫,先扫到谁都棋,谁就赢(前提是没有对方的人挡路..) #include<cstdio> #include<cstring> #include<iostream> using namespace std; #define MAX(x,y) (((x)>(y)) ? (x) : (y)) #define MIN(x

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

题意:给你很多对数,要么是0要么是1.不全0则ans++. 思路即题意. #include<cstdio> #include<cstring> #include<iostream> 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))

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

题意: 这道英文题的题意稍稍有点复杂. 找长度为n的数字序列有多少种.这个序列可以分为n/k段,每段k个数字.k个数可以变成一个十进制的数Xi.要求对这每n/k个数,剔除Xi可被ai整除的情况,剔除X的第一个数(包括前导0)是bi的情况.问剩下的组合有多少种. 思路: 这题我是一波三折的.首先也没有考虑很多,看着可以暴力模拟过程,我就直接开始敲了,几个for循环敲出来,再把bug调一调和特殊情况考虑考虑,交了之后开始TLE,这时候意识到复杂度太大了,于是开始优化,做了(b[i])*(mmax/1

随笔—邀请赛前训—Wizards&#39; Duel

题意:给出一个距离,2端2个物体,给出速度v1,v2   相对前进,相遇后速度不变反弹,回端点都又速度不变反弹,求第二次相遇点位置. 思路:物理常识啊... #include<cstdio> #include<cstring> #include<iostream> using namespace std; #define MAX(x,y) (((x)>(y)) ? (x) : (y)) #define MIN(x,y) (((x) < (y)) ? (x)

随笔—邀请赛前训—Duff and Weight Lifting

题意:给你一串数Wi,表示一串2^Wi.规则是如果sum(2^wi)==2^x(x是整数),就可以去除这些数.否则step++: 问你最小step. 思路:考虑到2^n+2^n=2^(n+1),所以我们可以按wi从小到大将n个wi合并成n/2个(wi+1)  ,再判断n是奇偶,是奇数就step++: #include <iostream> #include <stdio.h> #include <string.h> using namespace std; const

CodeForces 588B

题目链接 : http://codeforces.com/problemset/problem/588/B 题目大意: 这个题目的意思就是找出一个数中的因子,这个因子满足以下条件: 1.此数的因子没有完全平方数 2.是N中最大的因子 解题思路: 如果从1找到N,无疑会超时,所有我们只要从1到找sqrt(n)就好了,然后先判断从最大因子开始判断是否满足条件,若满足直接输出即可. #include <cstdio> #include <cstring> #include <cma

Codeforces Round #326(Div2)

CodeForces 588A 题意:Duff喜欢吃肉,想在接下来的n天,每天都有Ai斤肉吃,但每一天肉的单价Pi不定,肉 可以保存不过期,现已知n天每天肉的斤数Ai,以及单价Pi,为了使每天都             有想要的Ai斤肉吃,求最小花费.  思路:cost=Ai*min(pi)  1<=i<=n; 代码: 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using