完全平方数——唯一分解定理

一、唯一分解定理是什么?

1.定义

唯一分解定理是数论中的一个重要定理,它告诉我们:

任何大于 1 的正整数,都可以唯一分解为若干个质数的乘积(忽略排列顺序)。

数学表达式:
对于任意正整数 ( n > 1 ) ( n > 1 ) (n>1),可以表示为:
n = p 1 e 1 × p 2 e 2 × ⋯ × p k e k n = p_1^{e_1} \times p_2^{e_2} \times \cdots \times p_k^{e_k} n=p1e1×p2e2××pkek
其中:

  • ( p 1 , p 2 , … , p k ) ( p_1, p_2, \dots, p_k ) (p1,p2,,pk) 是质数;
  • ( e 1 , e 2 , … , e k ) ( e_1, e_2, \dots, e_k ) (e1,e2,,ek) 是正整数;

2.示例

  1. 12 的分解
    12 = 2 2 × 3 1 12 = 2^2 \times 3^1 12=22×31
    质因数是 2 2 2 3 3 3

  2. 100 的分解
    100 = 2 2 × 5 2 100 = 2^2 \times 5^2 100=22×52
    质因数是 2 2 2 5 5 5
    修改后的格式如下:

  3. 97 的分解
    97 = 9 7 1 97 = 97^1 97=971
    97 97 97 是质数,本身就是唯一分解。


3.代码模板

import java.util.*;
public class Main {
    public static void main(String[] args) {
      Scanner sc = new Scanner(System.in);
      int n=sc.nextInt();
      
      //Math.sqrt(n)可以进行时间优化
      for(int i=2;i<=Math.sqrt(n);i++){
          if(n%i==0){
              int count=0;//记录当前质数i的幂次
              while(n%i==0){
                  count++;
                  n/=i;//除掉所有因子i
              }
              System.out.println(i+" "+count);//输出对应的因子 以及 它的幂次
          }
      }
      
      if(n>1){//如果没有除完,最后一个数一定是质因子
          System.out.println(n+" "+1);//输出对应的因子 以及 它的幂次
      }

    }
}

二、例题

1>问题描述(2021蓝桥杯省赛)

一个整数 a a a 是一个完全平方数,是指它是某一个整数的平方,即存在一个整数 b b b,使得 a = b 2 a = b^2 a=b2

给定一个正整数 n n n,请找到最小的正整数 x x x,使得它们的乘积是一个完全平方数。


输入格式

输入一行包含一个正整数 n n n


输出格式

输出找到的最小的正整数 x x x


样例输入 1

12

样例输出 1

3

样例输入 2

15

样例输出 2

15

评测用例规模与约定

  • 对于 30 的评测用例, 1 ≤ n ≤ 1000 1 \leq n \leq 1000 1n1000,答案不超过 1000 1000 1000
  • 对于 60 的评测用例, 1 ≤ n ≤ 1 0 8 1 \leq n \leq 10^8 1n108,答案不超过 1 0 8 10^8 108
  • 对于所有评测用例, 1 ≤ n ≤ 1 0 12 1 \leq n \leq 10^{12} 1n1012,答案不超过 1 0 12 10^{12} 1012

2>解题思路

根据题意分析,我们要求最小的 x x x 使得 x × n x\times n x×n 是一个完全平方数。 显而易见的是,最坏情况, x x x 只能是 n n n本身。因此我们只需要在整数 n n n 以内去寻找最小的 x x x 即可。 结合唯一分解定理,任何一个大于1的整数,一定可以分解成一个或者多个质数(也叫素数)相乘。如果一个数是完全平方数,则经过唯一分解后,其质因子的幂次一定是偶数! 例如:

  1. 36 36 36 的分解
    36 = 2 2 × 3 2 36 = 2^2 \times 3^2 36=22×32
    幂次: 2 , 2 2, 2 2,2(都是偶数)
    因此, 36 36 36 是完全平方数。

  2. 144 144 144 的分解
    144 = 2 4 × 3 2 144 = 2^4 \times 3^2 144=24×32
    幂次: 4 , 2 4, 2 4,2(都是偶数)
    因此, 144 144 144 是完全平方数。

  3. 81 81 81 的分解
    81 = 3 4 81 = 3^4 81=34
    幂次: 4 4 4(是偶数)
    因此, 81 81 81 是完全平方数。

  4. 100 100 100 的分解
    100 = 2 2 × 5 2 100 = 2^2 \times 5^2 100=22×52
    幂次: 2 , 2 2, 2 2,2(都是偶数)
    因此, 100 100 100 是完全平方数。

  5. 72 72 72 的分解(反例)
    72 = 2 3 × 3 2 72 = 2^3 \times 3^2 72=23×32
    幂次: 3 , 2 3, 2 3,2 3 3 3 不是偶数)
    因此, 72 72 72 不是完全平方数。

至此,解题思路就很明了啦。唯一分解给定的 n n n 寻找其质因子,如果质因子对应的幂次是奇数,则需要补齐对应的一个质因子,把它累乘到答案中即可。


3>假娃

import java.util.*;

// 1:无需package
// 2: 类名必须Main, 不可修改

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
		//测试用例数据规模比较大,必须用long
        long ans=1;
        long n=sc.nextLong();
        for(long i=2;i<=Math.sqrt(n);i++){
            if(n%i==0){
                long count=0;
                while(n%i==0){
                    count++;
                    n/=i;
                }
                if(count%2==1){
                    ans*=i;
                }
            }
        }
        if(n>1)ans*=n;
        System.out.println(ans);

    }
}

3>C嘎嘎

#include <iostream>
#include <cmath> // 用于 sqrt 函数
using namespace std;

int main() {
    long long ans = 1; // 用 long long 处理大数
    long long n;
    cin >> n; // 输入 n

    for (long long i = 2; i <= sqrt(n); i++) {
        if (n % i == 0) { // 判断是否为因子
            long long count = 0;
            while (n % i == 0) { // 统计当前因子的幂次
                count++;
                n /= i;
            }
            if (count % 2 == 1) { // 如果幂次是奇数
                ans *= i;
            }
        }
    }

    if (n > 1) ans *= n; // 如果 n 还大于 1,则 n 本身是一个质数
    cout << ans << endl; // 输出结果

    return 0;
}


请添加图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值