完全平方数(第十二届蓝桥杯省赛第二场C++A/B组)

题目描述:

完全平方数(第十二届蓝桥杯省赛第二场C++A/B组)_第1张图片

 解题思路:

题目问题:

该题实现代码极为简单

但其中隐藏的思路却是稍微有点复杂的

我们要怎么去思考这道题呢?

首先观察题目所给的要求是n*x等于一个数的平方

要找的是最小的一个正整数x让 n*x 为一个完全平方数

什么样的x才能满足条件呢?

思路引导:

我们可以想到当一个数b可以被开根号的时候

并得到的是一个正整数时

换句话说解释是 由一个数a的平方可以到b

而对于任意正整数a的平方我们可以观察到它必定可以化为

偶数个相同质数相乘

而要使一个数为完全平方数

我们就要让它没有奇数的质数存在

由于题目给定一个能够相乘的数

我们就让x变成所有数目为奇数的质数相乘即可

解题:

由数据范围为从1到1e12

当数据为最大1e12时

则我们也只需要从1枚举到1e6

就可以找到n所有质因数

而找到质因数我们可以通过不断的除以

从2开始的

所有能够被除的数(每次统计是否除的次数为奇数,为奇数则乘上该质因子)

(这样可以保证每次除的数为质数,证明省略)

而我们从2到1e6除到

所有能被除的数的最后

余下来的数就必定是

奇数个质因子的相乘

(举个栗子 3*5,我们只能枚举到3,

又假如为3*5*5,我们可以枚举到8

我们可以得到

如果余下来的数中含有大于等于2个相同的质数

那么它必定可以被枚举到

所有最后只需要在乘以余下来的数即可

代码详解:

#include
using namespace std;

typedef long long ll;

int main(){
    ll n;
    cin>>n;
    
    ll res=1;
    for(ll i=2;i*i<=n;i++){
        ll cnt=0;
        while(n%i==0) n/=i,cnt++;
        
        if(cnt&1) res*=i;
    }
    
    res*=n;
    
    cout<

你可能感兴趣的:(蓝桥杯历年真题,每日一题分享,蓝桥杯,c++)