首页 > 其他分享 >完全平方数

完全平方数

时间:2024-03-09 22:14:29浏览次数:9  
标签:... 平方 ch int 自然数 完全 素数 ans

一、题目描述

P8754 [蓝桥杯 2021 省 AB2] 完全平方数

二、问题简析

2.1 唯一分解定理

唯一分解定理:大于1的自然数都可以唯一地写成素数的积

由该定理,一个大于 \(1\) 的自然数 \(b\) 可以表示为 \(b=a_1^{p_1}*a_2^{p_2}*...*a_n^{p_n}\) (\(a_1, a_2, ..., a_n\) 为素数;\(p_1, p_2, ..., p_n\) 为对应的指数,即有 \(p_n\) 个该数)。该自然数 \(b\) 的平方为 \(b^2 = a_1^{2p_1}*a_2^{2p_2}*...*a_n^{2p_n}\),所有的指数都是偶数
我们可以得到,若一个自然数是完全平方数,则将该自然数写出素数的积后,每个素数的指数一定是偶数。

因此,我们可以分解 \(n\),将指数不为偶数的素数相乘,就得到了 \(x\)。

2.2 分解自然数

以下代码给出了如何将大于 \(1\) 的自然数分解为素数的积。

// 将整数n分解成若干个素数,除1和本身
map<int, int> factors(int n)
{
    map<int, int> ans;      // 分解n后,有ans[i]个i
    // n==1,特殊考虑
    if (n == 1)
    {
        ans[n] = 1;
        return ans;
    }
    // 1和本身总是因数,这里忽略
    for (int i = 2; i * i <= n; i++)
    {
        // 可能有若干个i
        while (n % i == 0)
        {
            ans[i]++;       // 分解出一个i
            n /= i;
        }
    }
    if (n != 1)             // n==1,已经分解完了
        ans[n] += 1;
    return ans;
}

三、AC代码

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

int quickin(void)
{
	int ret = 0;
	bool flag = false;
	char ch = getchar();
	while (ch < '0' || ch > '9')
	{
		if (ch == '-')    flag = true;
		ch = getchar();
	}
	while (ch >= '0' && ch <= '9' && ch != EOF)
	{
		ret = ret * 10 + ch - '0';
		ch = getchar();
	}
	if (flag)    ret = -ret;
	return ret;
}



int main()
{
	#ifdef LOCAL
	freopen("test.in", "r", stdin);
	#endif
	
	ll n, ans = 1;
	cin >> n;
	if (n == 1)
	{
		cout << 4 << endl;
		return 0;	
	}
	
	for (ll i = 2; i * i <= n; i++)
	{
		ll cnt = 0;
		while (n % i == 0)
		{
			cnt += 1;
			n /= i;	
		}
		if (cnt % 2 != 0)    ans *= i;
	}
	if (n != 1)    ans *= n;
	
	cout << ans << endl;
	
	return 0;
}

标签:...,平方,ch,int,自然数,完全,素数,ans
From: https://www.cnblogs.com/hoyd/p/18063455

相关文章

  • 代码随想录 第十六天 | ● 104.二叉树的最大深度 559.n叉树的最大深度 ● 111.二叉树
    leetcode:104.二叉树的最大深度-力扣(LeetCode)思路:递归判断每次左右节点的是否存在,存在自然加一,return的1就是这样,判断子节点的左右两端是否有节点,统计有的节点数量,也就是左右的高度classSolution{publicintmaxDepth(TreeNoderoot){//后序遍历if......
  • abc342D 乘积为完全平方数的对数
    题面:给定长为n的数组A,问有多少对下标(i,j)满足A[i]*A[j]为完全平方数?范围:n<=2E5;A[i]<=2E5思路:完全平方数即质因子的个数为偶数,因此对元素进行化简,把偶次质因子都去掉,再统计即可。另外,0乘任何数都为0,需要单独处理。#include<bits/stdc++.h>usingnamespacestd;#defineint......
  • 完全颠覆Windows使用体验!微软将在今年发布“AI Explorer”
    据WindowsCentral报道,微软将在今年晚些时候在Windows11上推出一系列AI功能,其中就包括被内部称为“AIExplorer”的新功能。据消息人士透露,“AIExplorer” 被微软描述为“高级Copilot”,是将AIPC与非AIPC区分开来的重磅AI体验。其内置的历史记录/时间线功能可以在所有应用中......
  • 【LeetCode】977. 有序数组的平方
    题目:977.有序数组的平方解题思路:分析题目,左侧负数的平方可能超过右侧正数的平方,所以考虑使用双指针法,从左右向中间遍历最大值将遍历结果放入新创建的数组中,返回数组由于该问题的传入数组大小不确定,故只能使用动态数组创建方法,malloc方法导入<math.h>,使用abs绝对值比较函数,......
  • 代码随想录算法训练营第二天| 977.有序数组的平方、 209.长度最小的子数组、 59.螺旋
    977.有序数组的平方https://leetcode.cn/problems/squares-of-a-sorted-array/description/publicstaticint[]sortedSquares(int[]nums){intleft=0;intright=nums.length-1;int[]result=newint[nums.length];intwrite=......
  • 222. 完全二叉树的节点个数c
    /***Definitionforabinarytreenode.*structTreeNode{*intval;*structTreeNode*left;*structTreeNode*right;*};*/intcountNodes(structTreeNode*root){if(!root)return0;if(!root->left&&!root->......
  • P8681 [蓝桥杯 2019 省 AB] 完全二叉树的权值
    做这道题的时候混淆了满二叉树和完全二叉树的概念:满二叉树:顾名思义,就是塞满了完全二叉树:除了最后一层之外,每一层都必须是满的,且最后一层如果不满,则所有节点都尽可能靠左。#include<iostream>#include<stdio.h>#include<algorithm>#include<string>#defineFor(i,j,n......
  • apache2和nginx卸载总是不干净不完全导致无法重装,重装成功也无法启动
    大着胆子把nginx卸载了用的命令是  sudoaptremovenginx 结果最后不知道怎么折腾的就算重新装也装不上了,然后就转头折腾apache2,也卸载了  sudoaptremoveapache2 然后也一样,重装后,服务起不来了。不知道哪儿出错了,就想着看看重新卸载试试看,然后执行了发现还是卸载不干......
  • day50 动态规划part7 代码随想录算法训练营 279. 完全平方数
    题目:279.完全平方数我的感悟:看文字也行理解难点:物品是什么?是i*i<n的集合听课笔记:代码示例:classSolution:defnumSquares(self,n:int)->int:#完全背包问题#顺序没关系,组合把#递推公式难想,dp[j]=min(dp[j],dp[j-i*i]+1)......
  • 可用于智能客服的完全开源免费商用的知识库项目
    FastWiki项目是一个高性能、基于最新技术栈的知识库系统,专为大规模信息检索和智能搜索设计。利用微软SemanticKernel进行深度学习和自然语言处理,结合.NET8和MasaBlazor前端框架,后台采用.NET8+MasaFramework+SemanticKernel,实现了一个高效、易用、可扩展的智能向量搜索平台。我......