完全平方数算法题

2023-11-07

题目描述:
对于一个序列,牛牛每次可以将序列中任意一个位置上的数乘上任意一个质数。
现在他想知道至少需要多少次操作才能使得该序列中的任意两个不同位置的数相乘都为完全平方数。
完全平方数:对于x,若其可以写成 i × i = x i×i=x i×i=x的形式,则称x为完全平方数。
提示:一个数是完全平方数的充要条件是其所有质因子的指数都为偶数,例如 2 2 × 3 2 = 36 2^2 × 3^2 =36 22×32=36

输入描述:
第一行输入一个整数N,表示序列长度
接下来一行输入N个整数,表示该序列
对于 100 % 的数据, 1 ≤ N ≤ 1 0 5 , 1 ≤ 序列中的数 ≤ 1 0 5 对于100\% 的数据,1 ≤ N ≤ 10^5 , 1 ≤ 序列中的数 ≤ 10^5 对于100%的数据,1N1051序列中的数105

输出描述:
输出一个整数表示答案

示例1:
输入
3
2 1 2
输出
1
说明
只需要将第二个1乘上2即可,这样序列就变为2 2 2,任意两个数相乘都是4

示例2:
输入
3
2 4 6
输出
2
说明
将4乘上2,将6乘上3,序列变为2 8 18,任意两个数相乘都是完全平方数

#include <bits/stdc++.h>
using namespace std;
map<int, int> odd,even;
//记录在给出的n个数中,针对各个质因数的指数为偶数或者奇数的个数
//比如odd[2]=1就代表在n个数中质因数2的指数为奇数的有1个

void divide(int n)
{
    for(int i=2;i*i<=n;i++)
        if(n%i==0)
        {
            int s=0;
            while(n%i==0)
            {
                n/=i;
                s++;
            }
            if(s%2==1){
                odd[i]++;
            }
            else{
                even[i]++;
            }
        }
    if(n>1) odd[n]++;//到最后若n>1,代表还有一个大于根号n的质因数存在
}
//注意:比如9不存在质因数2,那么相当于其质因数2的指数为0,相当于应该even[2]加上1。但我们的记录并没有记录这种情况的。所以odd[i]+even[i]可能小于n
int main()
{
    int n, x,maxx=0, res=0;
    cin >> n;
    for(int i = 0; i < n; i ++)
    {
        cin >> x;
        maxx=max(x,maxx);
        divide(x);
    }
    for(int i = 2; i<maxx+1; i++)//最大的质因数不可能超过maxx,i可直接从2开始
    {
        //质因数i的指数均为偶数时不用做任何操作
        
        //质因数i的指数均为奇数时要考虑有比如不存在该质因数的数的存在,比如9不存在质因数2,即指数为0。
        if(odd[i] != 0 && odd[i] < n)//如果odd[i]==n的话说明输入的n个数中不会有 上述这种数的存在 自然也就不用操作了
            res += min(odd[i], n - odd[i]);//n-odd[i]就是把 上述这种数的存在 考虑了进来。如果写成min(odd[i], even[i])就错了
            //上面这行代码意思就是要么把奇数都转化为偶数,或 上述这种数 都转化为奇数(两种情况取小)

    }
    cout << res << endl;
    return 0;
}

可以用输入
4
1 2 4 6
代入理解上述代码

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

完全平方数算法题 的相关文章

  • 无法使用 strptime() 获取秒数

    我收到 YYYY MM DDThh mm ss S Z hh mm 这种格式的日期时间 我正在尝试使用复制该值strptime如下所示 struct tm time 0 char pEnd strptime datetime Y m dT
  • 在 LINQ 查询中返回不带时间的日期

    我正在编写一个查询 我想计算按日期联系我们的呼叫中心的次数 看起来很简单 但由于联系日期字段是日期时间字段 我得到了时间 因此当我按联系日期 时间 分组时 每个联系日期实例的计数为 1 所以 我想只按日期分组 而不按时间分组 下面是我用来查
  • 如何在 Unity 中从 RenderTexture 访问原始数据

    问题的简短版本 我正在尝试访问 Unity 中 RenderTexture 的内容 我一直在使用 Graphics Blit 使用自己的材质进行绘制 Graphics Blit null renderTexture material 我的材
  • 为什么 POSIX 允许在只读模式下超出现有文件结尾 (fseek) 进行搜索

    为什么寻找文件结尾很有用 为什么 POSIX 让我们像示例中那样在以只读方式打开的文件中进行查找 c http en cppreference com w c io fseek http en cppreference com w c io
  • C# 中值类型和引用类型有什么区别? [复制]

    这个问题在这里已经有答案了 我知道一些差异 值类型存储在堆栈上 而引用类型存储在托管堆上 值类型变量直接包含它们的值 而引用变量仅包含对托管堆上创建的对象位置的引用 我错过了任何其他区别吗 如果是的话 它们是什么 请阅读 堆栈是一个实现细节
  • 使用 C# 在 WinRT 中获取可用磁盘空间

    DllImport kernel32 dll SetLastError true static extern bool GetDiskFreeSpaceEx string lpDirectoryName out ulong lpFreeBy
  • 写入和读取文本文件 - C# Windows 通用平台应用程序 Windows 10

    有用 但在显示任何内容之前 您必须在文本框中输入内容 我想那是因为我使用了 TextChanged 事件处理程序 如果我希望它在没有用户交互的情况下显示文本文件的内容 我应该使用哪个事件处理程序 因此 我想在按下按钮时将一些数据写入 C W
  • 为什么模板不能位于外部“C”块内?

    这是一个后续问题一个答案 https stackoverflow com questions 4866433 is it possible to typedef a pointer to extern c function type wit
  • 我的 strlcpy 版本

    海湾合作委员会 4 4 4 c89 我的程序做了很多字符串处理 我不想使用 strncpy 因为它不会终止 我不能使用 strlcpy 因为它不可移植 只是几个问题 我怎样才能让我的函数正常运行 以确保它完全安全稳定 单元测试 这对于生产来
  • 像“1$”这样的位置参数如何与 printf() 一起使用?

    By man I find printf d width num and printf 2 1 d width num 是等价的 但在我看来 第二种风格应该与以下相同 printf d num width 然而通过测试似乎man是对的 为什
  • 更改窗口的内容 (WPF)

    我创建了一个简单的 WPF 应用程序 它有两个 Windows 用户在第一个窗口中填写一些信息 然后单击 确定 这会将他们带到第二个窗口 这工作正常 但我试图将两个窗口合并到一个窗口中 这样只是内容发生了变化 我设法找到了这个更改窗口内容时
  • .NET 选项将视频文件流式传输为网络摄像头图像

    我有兴趣开发一个应用程序 它允许我从 xml 构建视频列表 包含视频标题 持续时间等 并将该列表作为我的网络摄像头流播放 这意味着 如果我要访问 ustream tv 或在实时通讯软件上激活我的网络摄像头 我的视频播放列表将注册为我的活动网
  • 网络参考共享类

    我用 Java 编写了一些 SOAP Web 服务 在 JBoss 5 1 上运行 其中两个共享一个类 AddressTO Web 服务在我的 ApplycationServer 上正确部署 一切都很顺利 直到我尝试在我的 C 客户端中使用
  • AccessViolationException 未处理

    我正在尝试使用史蒂夫 桑德森的博客文章 http blog stevensanderson com 2010 01 28 editing a variable length list aspnet mvc 2 style 为了在我的 ASP
  • 检查 url 是否指向文件或页面

    我们需要以下内容 如果文件确实是文件 则从 URL 下载该文件 否则 如果它是一个页面 则什么也不做 举个简单的例子 我有以下命令来下载文件 My Computer Network DownloadFile http www wired c
  • 在 ASP.NET 中将事件冒泡为父级

    我已经说过 ASP NET 中的层次结构 page user control 1 user control 2 control 3 我想要做的是 当控件 3 它可以是任何类型的控件 我一般都想这样做 让用户用它做一些触发回发的事情时 它会向
  • 窗体最大化时自动缩放子控件

    有没有办法在最大化屏幕或更改分辨率时使 Windows 窗体上的所有内容自动缩放 我发现手动缩放它是正确的 但是当切换分辨率时我每次都必须更改它 this AutoScaleDimensions new System Drawing Siz
  • 如何在 C# 中播放在线资源中的 .mp3 文件?

    我的问题与此非常相似question https stackoverflow com questions 7556672 mp3 play from stream on c sharp 我有音乐网址 网址如http site com aud
  • 将变量分配给另一个变量,并将一个变量的更改反映到另一个变量中

    是否可以将一个变量分配给另一个变量 并且当您更改第二个变量时 更改会瀑布式下降到第一个变量 像这样 int a 0 int b a b 1 现在 b 和 a 都 1 我问这个问题的原因是因为我有 4 个要跟踪的对象 并且我使用名为 curr
  • 更改显示的 DPI 缩放大小使 Qt 应用程序的字体大小渲染得更大

    我使用 Qt 创建了一些 GUI 应用程序 我的 GUI 应用程序包含按钮和单选按钮等控件 当我运行应用程序时 按钮内的按钮和字体看起来正常 当我将显示器的 DPI 缩放大小从 100 更改为 150 或 200 时 无论分辨率如何 控件的

随机推荐

  • 如何将时间戳转化为时间格式化字符串

    问题描述 通常服务器返回的时间都不以这种格式出现比如2021 6 1 20 08 30 通常会以Unix时间元年为起点 返回对应的时间戳 15355352553 时间戳 那么我们如何将时间戳转化为时间格式化字符串 首先将时间戳转化为Date
  • matlab时频分析之连续小波变换cwt

    matlab时频分析之连续小波变换cwt 1 小波分析简介 2 小波分析基本原理 3 cwt的matlab实现 4 cwt的边缘效应与影响锥 5 cwt的重构 icwt 6 增加cwt的分辨率的wsst 2020年7月更新 第3节绘制了一个
  • 如何 打造软件系统的亮点

    我们知道 一个软件系统除了能够实现最基本的业务功能之外 通常还会有一些独特的地方 比如说在视觉上给用户带来强烈的震撼效果 或者从业务流程上简化了客户的业务操作 抑或是给客户节省了用户的资源等等 凡是这些能够给客户留下深刻印象 并让客户满意的
  • python小游戏——飞机大战代码开源

    作者 小刘在这里 每天分享云计算网络运维课堂笔记 努力不一定有收获 但一定会有收获加油 一起努力 共赴美好人生 夕阳下 是最美的 绽放 愿所有的美好 再疫情结束后如约而至 目录 一 效果呈现 二 主代码 三 cfg 四 README 一 效
  • 2023年第六届先进控制,自动化与机器人国际会议(ICACAR 2023)

    2023年第五届先进控制 自动化与机器人国际会议 ICACAR 2023 重要信息 会议网址 www icacar org 会议时间 2023年4月14 16日 召开地点 中国北京 截稿时间 2023年2月28日 录用通知 投稿后2周内 收
  • m3u8手机批量转码_M3U8批量转换app下载_M3U8批量转换MP4安卓版下载v1.0_智能家应用...

    M3U8批量转换MP4软件 一个简单高效的M3U8转MP4格式软件 支持一键批量转换 在安卓手机上进行操作 传输或者下载的M3U8格式视频文件一般无法打开浏览 直接在这里进行转换 可选择转换后删除源文件 直接获取到可以正常观看的MP4格式文
  • Javascript中的assign()方法到底是浅拷贝还是深拷贝?

    针对于第一级拷贝是深拷贝 对于第二级拷贝是浅拷贝 看代码 let A a aa 10 b 11 let B A c 111 console log B a aa 10 b 11 c 111 B a aa 修改1 B b 修改2 consol
  • wxSearchCtrl类使用指南

    wxSearchCtrl类使用指南 wxSearchCtrl是wxWidgets库中的一个类 它提供了一个搜索框控件 允许用户输入关键字进行搜索 在本文中 我们将介绍如何使用wxSearchCtrl以及它的一些常见用法 基本使用方法 要使用
  • 【c++类的默认六个成员函数详解】

    类的六个默认成员函数 构造函数 析构函数 拷贝构造 赋值运算符重载 取地址运算符重载 const修饰的取地址运算符重载 为什么要有这些默认成员函数 如果一个类 在初始化之前就调用了打印函数 则会导致输出的是一个随机值 为了避免这种情况 所以
  • windows程序逆向笔记(一)

    1 吾爱破解 l 按钮 程序运行的日志 插件加载的信息查看 e 按钮 模块信息 程序加载的所有模块 库 都可以看到路径等 双击就可以看到基地址 m 按钮 内存信息 对于 e按钮中 的各个模块的基地址等 t 按钮 线程信息 w 按钮 窗口信息
  • websocket 在 react中的使用全过程

    文章目录 前言 一 前端调用代码 二 前后端联调中的问题 1 连接成功之路 1 完全没成功 2 进入onopen 但是没数据 2 神奇的 userId 三 运用到项目中发现的问题 总结 前言 前一段时间需要做一个关于监控服务器的需求 如果某
  • Java常见的几种设计模式

    单例设计模式 一个类只允许创建一个对象 或者实例 那这个类就是一个单例类 这种设计模式就叫做单例设计模式 1 如何实现一个单例 构造函数需要是 private 访问权限的 这样才能避免外部通过 new 创建实例 考虑对象创建时的线程安全问题
  • 密码学课设实验——序列密码c++实现

    一 实验目的 通过实现简单的线性反馈移位寄存器 LFSR 理解LFSR的工作原理 本原多项式的重要意义 二 实验内容 1 利用C C 语言实现给定的LFSR 2 通过不同初始状态生成相应的序列 并观察它们的周期有什么特点 3 利用生成的序列
  • git 中获取短的 commit hash 值

    本文摘至 http www open open com lib view open1328070367499 html Git 很聪明 它能够通过你提供的前几个字符来识别你想要的那次提交 只要你提供的那部分 SHA 1 不短于四个字符 并且
  • which——查看所使用的一系列命令的程序文件的存放位置

    which命令 1 作用 查看所使用的一系列命令的程序文件的存放位置 2 语法 which 要查找的命令
  • 字节跳动实习记录

    秋招 秋招能拿到字节跳动offer是我没有想到的 暑期只是拿到深圳一家小公司的offer 没有大厂实习经验 秋招迅雷一面挂 腾讯二面挂 能拿到的只有富途和深信服的offer 本打算去富途 但是后面又接到字节跳动的面试通知 原来笔试过了 但是
  • STM32 DMA传输 中断方式配置 源代码

    stm32单片机源程序 include pbdata h void RCC Configuration void void GPIO Configuration void void NVIC Configuration void void
  • jenkins 集成单元测试

    1 jenkins 集成单元测试 1 1先来一张图 趋势图和最新测试结果 出现的前提必须有一次成功的测试通过才能出现 1 2 点击红色 可以看到具体那个单元测试类报错 点到具体的测试类 会显示对应方法 和错误原因 2 配置 pip流水线代码
  • Mysql5.7报错get db conn fail this authentication plugin is not supported

    系统环境CentOS 6 x Mysql5 7 1 前言 在部署open falcon的时候 第一启动有很多模块都失败 查看log日志有如下报错 2019 01 04 10 33 13 db go 22 g InitDB get db co
  • 完全平方数算法题

    题目描述 对于一个序列 牛牛每次可以将序列中任意一个位置上的数乘上任意一个质数 现在他想知道至少需要多少次操作才能使得该序列中的任意两个不同位置的数相乘都为完全平方数 完全平方数 对于x 若其可以写成 i i x i i x