POJ 1845 Sumdiv题解(C++ 整数惟一分解定理+分治法求等比数列之和+快速幂)

news2024/11/14 2:06:06

文章目录

  • 整数惟一分解定理
  • 分治法求等比数列和
  • 完整代码

传送门:
POJ 1845 SumDiv

整数惟一分解定理

任何一个大于1的整数n都可以分解成若干个质因数(素因数)的连乘积,如果不计各个素因数的顺序,那么这种分解是唯一的,即若n>1,一定存在:n=p1p2p3…pm(p1.p2.均为n的质因数)

上式常记作:
在这里插入图片描述
称为n的标准分解式,质因数分解式


对于n的标准分解式来说:根据n的标准分解式可以得到以下结论!!!!很重要!!!

  • 可求得n的所有因子个数:(a1+1)(a2+1)(a3+1…+ak+1)
  • n的所有因子之和:对每个质因数计算由0次至最高次方幂的和,最后把得到的数相乘就得到n的所有因子的和.

在这里插入图片描述

注意:这两个结论非常重要!!!!!!!!!!


再次回到题目:让我们求x^y,因此x的标准分解式如上图所示,我们计算x的y次方,实际上就是计算x的标准分解式的y次方!!!!!!!!!!!

在这里插入图片描述
因此题目让我们求x^y的所有因子之和取余9901,因此这道题就是让我们求:


上图中x^y的所有因子之和 然后取余p的结果。,我们只要求得上面的那个长式子的值即可,这个长式子其实就是等比数列求和,因为它的每一个括号里都是一个等比数列的项


我们的基本思路就已经完成了,即我们现在的问题就是如何求得 x^y 的所有因子之和的那一串长式子,即等比数列的和

可以看出:

  • 1+p1^1+ p1^2+ p1^3 +… p1^n
  • 1+p2^1+ p2^2+ p2^3 +… p2^n
  • 1+pn^1+ pn^2+ pn^3 +… pn^n

他们都具有相同的结构,即
在这里插入图片描述

但是如何求出这个等比数列的和呢?

分治法求等比数列和

我们采用分治法求等比数列的和,我们首先来给这个S举一个例子:
在这里插入图片描述

因此我们就可以得到S的计算公式,分别为n是奇数的情况和n是偶数的情况。而我们注意到,在Sn的式子中,我们又可以得到(1+p1^1+… +p1^(n/2))这样一个式子,和我们一开始的S的式子形状类似:所以我们便可以通过递归求解中间第二个长式子,而我们可以通过快速幂求得第一个括号里的短式子:(1+ p1^(n/2+1)),而我们要求这一个Sn,只需要传递一个n参数(位数)和p1参数(底数)


分治求快速幂的模板:注意求和之后要取mod

//分治求快速幂
LL sum(int n,int p1)
{
	if (n == 0)return 1;
	if (n & 1)
	{
		//n是奇数
		return (1 + qpow(p1, n / 2 + 1)) * sum(n / 2, p1) % p;
	}
	else
	{
		//n是偶数
		return (1 + qpow(p1, n / 2 + 1)) * (sum(n / 2 - 1, p1)) % p + qpow(p1, n / 2) % p;
	}
}

完整代码

之和,我们便可以求出x的每一个质因子,以及这个质因子所出现的次数,然后带入sum中,求出x^y 的每一个质因子的连乘积,一直乘到x<=1便得到了答案,注意几个细节:

  1. 代码中出现的所有数据类型最好使用long long 型,因此即使是一个统计某一个质因子的出现的次数 Cnt也应该是一个long long
  2. 注意所有式子中%p的顺序:在n为奇数的式子最后%p,在n为偶数的式子的中间%p,后面还有一个快速幂的式子也要%p(具体的我也不知道,反正%肯定没坏处)。另外ans在计算每一项式子得到答案的时候要一项一项的乘,然后%p,不能让ans乘以(…%p)的式子,即不能写成: ans*= … 这样写ans会超出数据范围,因为ans本身并没有%p。
#include <iostream>
#include <cmath>
using namespace std;

typedef long long LL;
const LL p = 9901;
int x, y;
LL qpow(LL a, LL b)
{
	/*
	快速幂
	*/
	LL res = 1 % p;
	for (; b; b >>= 1)
	{
		if (b & 1)
		{
			res = res * a % p;
		}
		a = a * a % p;
	}
	return res;
}
//分治求快速幂
LL sum(int n,int p1)
{
	/*
	n:项数
	p1:底数
	*/
	if (n == 0)return 1;
	if (n & 1)
	{
		//n是奇数
		return (1 + qpow(p1, n / 2 + 1)) * sum(n / 2, p1) % p;
	}
	else
	{
		//n是偶数
		return ((1 + qpow(p1, n / 2 + 1)) * (sum(n / 2 - 1, p1)) % p + qpow(p1, n / 2) % p);
	}
}
int main()
{
	LL ans = 1;
	cin >> x >> y;	//x^y
	for (int i = 2; i <= sqrt(x); i++)
	{
		int cnt = 0;
		if (x % i == 0)
		{
			while (x % i == 0)
			{
				x /= i;
				cnt++;
			}
			//i:就是x的某一个质因子			
			//cnt:就是x的某个质因子的幂次  cnt*y 就是x^y的质因子的连乘积的某一项
		}
		//n的所有因子之和的每一项: ans依次相乘
		ans *=sum(cnt * y, i) % p;
	}
	if (x > 1)
	{
		ans *=sum(y, x) % p;
	}
	cout << ans;
	return 0;
}

参考资源:

分治法求等比数列之和
《算法竞赛进阶指南》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/176793.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

王者荣耀入门技能树

前言 最近在学习技能树&#xff0c;我也试着写一写技能树&#xff0c;放松一下。 这里附上一张可爱的兔兔应景。仔细看&#xff0c;后边题目会提到&#xff0c;哈哈。 职业 以下哪个不属于王者荣耀中的职业&#xff1a; 射手法师辅助亚瑟 技能 以下哪个技能可以加快打野…

春节假期后,如何快速让员工恢复上班的元气和状态?

每当假期过后&#xff0c;总有一些员工无法快速恢复工作状态&#xff0c;团队的氛围也很难一下子热起来。而春节假期既是长假&#xff0c;又是过节氛围最浓厚的假期&#xff0c;节后返工的涣散问题自然更明显一些。但对于服装店铺来说&#xff0c;年后开工正处于旺季&#xff0…

【Vue】我的尚品汇项目笔记---20230109~20230120

014之前可参考官方笔记 https://blog.csdn.net/weixin_43424325/article/details/121684101 015-axios二次封装 api/index.js 设定 //当前模块&#xff0c;API进行统一管理&#xff0c;即对请求接口统一管理 import requests from "/api/request";//首页三级分类…

通达信插件获取并存储通达信商品指数的实时数据

一、引子 通达信商品指数一共有23个&#xff0c;如下图所示&#xff1a; 如果想获取历史数据&#xff0c;只需要通过通达信的数据下载和导出功能即可&#xff0c;现在我们需要获取这23个指数的实时数据&#xff0c;通过导出功能就没有办法了。 在最初的阶段&#xff0c;考虑的…

微服务自动化管理【IDEA使用Docker插件进行一键部署】

本章目标 IDEA使用Docker插件实现springboot项目的一键部署 要开两个虚拟机 server registry server上进行操作 Docker开启远程api端口(注意这种配置方式只适用于开发和学习&#xff0c;在公共网络中不要这样配置&#xff0c;容易引发安全问题) 默认情况下dokcer是不支持远程…

linux基本功系列之find命令实战

文章目录前言&#x1f680;&#x1f680;&#x1f680;一. find命令介绍二. find常用参数及语法格式三. 示范案例3.1 查找符合文件名规则的文件3.2 根据文件类型类查找文件3.3 按照更改时间或访问时间等查找文件3.4 查找并执行相应的命令3.5 按照文件大小来查找3.6 按照文件所有…

启动hive报错no hbase in

启动hive报错no hbase in 将hdfs和yarn都启动成功之后&#xff0c;启动hive&#xff0c;如下所示&#xff1a;[atguiguhadoop102 conf]$ cd /opt/module/hive/ [atguiguhadoop102 hive]$ bin/hive报错信息如下which: no hbase in (/usr/local/bin:/usr/bin:/usr/local/sbin:/us…

C++ · 类和对象 · 02 | 类的6个默认成员函数

啊我摔倒了..有没有人扶我起来学习.... &#x1f471;个人主页&#xff1a;《CGod的个人主页》\color{Darkorange}{《CGod的个人主页》}《CGod的个人主页》交个朋友叭~ &#x1f492;个人社区&#xff1a;《编程成神技术交流社区》\color{Darkorange}{《编程成神技术交流社区》…

【操作系统】—— 如何安装双系统与多系统(带你快速了解)

&#x1f4dc; “作者 久绊A” 专注记录自己所整理的Java、web、sql等&#xff0c;IT技术干货、学习经验、面试资料、刷题记录&#xff0c;以及遇到的问题和解决方案&#xff0c;记录自己成长的点滴。 &#x1f341; 操作系统【带你快速了解】对于电脑来说&#xff0c;如果说…

博客系统项目的自动化测试

作者&#xff1a;~小明学编程 文章专栏&#xff1a;测试开发 格言&#xff1a;热爱编程的&#xff0c;终将被编程所厚爱。 目录 博客界面 测试用例 界面测试 功能测试 性能测试 兼容性测试 易用性测试 安全性测试 ​编辑自动化测试 登录界面的测试 界面文字模块 测…

ubuntu使用教程与常用命令

ubuntu使用教程 一、 Ubuntu简介 Ubuntu&#xff08;乌班图&#xff09;是一个基于Debian的以桌面应用为主的Linux操作系统&#xff0c;据说其名称来自非洲南部祖鲁语或科萨语的“ubuntu”一词&#xff0c;意思是“人性”、“我的存在是因为大家的存在”&#xff0c;是非洲传…

Python爬虫之Scrapy框架系列(5)——项目实战【某瓣Top250电影所有信息的txt文本存储】

上篇文章已经成功解析提取到豆瓣Top250电影想要的所有数据。下一步就是将其交给管道进行存储。 目录&#xff1a;1. 编写items.py文件&#xff08;定义结构化数据字段&#xff09;2. 爬虫文件里将数据一一对应字段名&#xff1a;3. 将数据返回给管道&#xff1a;4. 编写pipelin…

MCAL系列介绍04-ICU

本文框架1. 前言2. 基本概念3. ICU采集过程3.1 获取周期占空比3.2 获取边沿数量3.3 获取时间戳4. Autosar系列文章快速链接1. 前言 ICU驱动器是使用Input Capture Uint模块&#xff08;ICU&#xff09;解调PWM信号、计数脉冲、测量频率和占空比、生成简单中断以及唤醒中断的模…

树莓派配置Python虚拟环境、安装PyQt5、安装PySide2

要从头设置好一台可用于开发的树莓派&#xff0c;可以参考树莓派 4B 无屏幕&#xff0c;连接WiFi、SSH、VNC&#xff0c;系统换源、pip换源&#xff0c;安装中文输入法 Python虚拟环境 树莓派&#xff08;或者说arm平台&#xff09;使用Python虚拟环境的正确方式是使用pipenv…

【手写 Vue2.x 源码】第三十九篇 - 组件部分 - 创建组件虚拟节点

一&#xff0c;前言 上篇&#xff0c;介绍了组件部分-组件的合并&#xff0c;主要涉及以下几个点&#xff1a; 组件初始化情况&#xff1b;组件合并的位置&#xff1b;组件合并的策略&#xff1b;组件合并后测试&#xff1b; 本篇&#xff0c;组件部分-组件的编译&#xff1…

【C语言】对<进阶版三子棋>的完善和改进

这篇文章主要是对前面三子棋游戏的完善和改进。 文章目录 目录 1.将棋子*和#&#xff0c;改为1和0&#xff1b; 2.电脑下棋显示坐标 3.可以选择电脑先手或玩家先手 4.在退出游戏时显示游戏信息 5.完善后的游戏效果 二、完整程序代码 1.game.h 2.test.c 3.game.c 总结 前言 h…

【教程】虚拟环境与Pytorch安装

【教程】虚拟环境与Pytorch安装NVIDIA驱动安装虚拟环境创建激活/删除相关库的安装Pytorch安装安装地址可能遇到的问题处理报错安装卡顿测试是否安装完成参考NVIDIA驱动安装 NVIDIA驱动可在官网进行安装&#xff1a;NVIDIA驱动官网 命令行输入nvidia-smi可查看cuda版本等信息&…

Linux常用命令——ss命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) ss 比 netstat 好用的socket统计信息&#xff0c;iproute2 包附带的另一个工具&#xff0c;允许你查询 socket 的有关统计信息。 补充说明 ss命令用来显示处于活动状态的套接字信息。ss命令可以用来获取socket…

XGBoost的原理、工程实现与优缺点

Xgboost简介 XGBoost是陈天奇等人开发的一个开源机器学习项目&#xff0c;高效地实现了GBDT算法并进行了算法和工程上的许多改进&#xff0c;被广泛应用在Kaggle竞赛及其他许多机器学习竞赛中并取得了不错的成绩。XGBoost本质上还是一个GBDT&#xff0c;但是力争把速度和效率发…

C++普通类,派生类,虚基类的成员构造顺序以及构造函数调用顺序详解

目录前言普通类构造析构顺序解析依赖关系产生的错误派生类构造析构顺序解析扩展菱形多继承场景含虚基类的派生类构造析构顺序解析扩展菱形多继承场景(引入虚继承)前言 C规定“对象的析构过程必须与其构造过程相反”这一语法规则。 因此我们研究透彻了构造过程&#xff0c;那么…