POJ 1845 Sumdiv 【整数的素数分解+逆元+快速幂+约数和公式】

整数的素数幂分解 整数的素数幂分解算数基本定理如何求一个整数的素数幂分解代码欧拉函数 算数基本定理 一个整数可以唯一的表示成素数的乘积。 如何求一个整数的素数幂分解 对一个整数的素数幂分解,是用试除法依次判断所有小于n\sqrt nn​的素数是否是它的因子,如果是,则记录这个素数及对应的幂次;并且将该素因子除干净,并且更新n。 找到一个小于等于n\sqrt nn​的素因子。(若找不到且n>1,则n是素数)。... 阅读详情

题目链接:http://poj.org/problem?id=1845

题意:求A^B的约数和,结果取余

思路:

整数的素数分解:任意一个整数都能通过若干个素数相乘得到,n = p1^a1 * p2 ^a2 * p3^a3 *..... pk^ak;相应的代码模板可以自己网上找找,也可以参考下面的代码 (能将一个整数的所有pi 和 ai 求出并存入数组中)

逆元:平常做的取模运算条件是 a和b必须是正整数,才能通过a % b 取模,但如果要求  1/a mod b,我们必须通过逆元求出;求逆元的方法有两种,第一种运用费马定理  a^(p-2) mod p 求出 (证明略)  ;第二种是通过逆元的递推公式 inv[i] = (Mod - Mod/i) * inv[M%i] %Mod ,求的逆元是  1/i mod Mod 的结果;

约数和公式:

由上面的素数分解可以知道一个整数由若干个素数乘积得到,而且同一个素数不止一个;那么一个整数的所有约数也一定是由这些有限的素数相乘得到,比如说 20 = 2*2*5,那么约数就有 2,2*2,5,2*5,2*2*5,(1就不用说了),由组合计数的知识可以知道,一个整数的约数个数就是对应素数个数的的乘积,即 (a1+1) * (a2+1) * (a3+1) * ... (ak+1);那么一个整数的所有约数的和又等于多少? 这里有一个公式(推导略,通过组合计数的知识推导得出) sum = (1 + p1^1 + p1^2 + p1^3 + ...+ p1^a1) * (1 + p2^1 + p2^2 + p2^3 + ...+ p2^a2) * ... *  (1 + pk^1 + ... pk^ak) ;

有了上面的知识点就能完成这道题了:首先是整数的素数分解,得到相应的素数和素数个数,通过约数和公式求出结果,在这过程中,如果只是用取模运算一个个去求 (1 + p1^1 + p1^2 + p1^3 + ...+ p1^a1) 会超时,这个式子可以换成等比公式去求会快很多;

(1 + p1^1 + p1^2 + p1^3 + ...+ p1^a1)  = (1 - p^(n+1)) / (1 - p);因为存在一个分数 1/ (1-p) 所以要用到逆元;

还有一个要十分注意的就是,逆元的分母不能为 0,或者是mod 的倍数,如果分母为0,或者是mod的倍数,那么这个分数是毫无意义的 (分数分母不为0),那么这题如果出现了这样的数据又如何处理?如果分母为0,就意味着 p == 1,等比公式中,如果底数为1,会直接通过 n*a1 处理,这里同样可以通过这样的方法处理分母为0,或者分母是mod的倍数的情况;

还有就是要注意精度,尽量用long long,防止溢出

 

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <cmath>

using namespace std;

typedef long long ll;

const int Maxn = 5e7+10;
const int Mod = 9901;

vector <ll> prime, cnt;

ll pow_mod (ll a, ll n) { // 快速幂
	if (n == 0) return 1;
	ll x = pow_mod (a, n/2);
	ll ans = x*x % Mod;
	if (n & 1) ans = ans*a %Mod;
	return ans;
}

void divprime (ll x) { // 整数的素数分解
	ll ct;
	for (ll i = 2; i*i <= x; ++i) {
		if (x % i == 0) {
			ct = 0;
			while (x % i == 0) {
				ct++; x /= i;
			}
			prime.push_back(i); cnt.push_back(ct);
		}
	}
	if (x > 1) {
		prime.push_back(x);
		cnt.push_back(1);
	}
}

int main (void)
{
	ll A, B;
	while (scanf ("%lld%lld", &A, &B) != EOF) {
        if (!A) cout << "0" << endl;
        else if (!B || A == 1) cout << "1" << endl;
        else {
        	prime.clear(); cnt.clear();
            divprime (A);
            ll ans = 1, m = prime.size(), tmp;
            for (ll i = 0; i < m; ++i) {
            	if ((prime[i]-1) % Mod == 0) ans = ans*(cnt[i]*B+1) % Mod; // 处理等比公式分母为0或者是Mod倍数的情况
            	else {
	            	tmp = (pow_mod (prime[i], cnt[i]*B+1)-1+Mod) % Mod;
	            	tmp = (tmp*pow_mod (prime[i]-1, Mod-2)) % Mod;
	                ans = ans*tmp % Mod;
				}
            }
            printf ("%lld\n", ans);
        }
	}
	return 0;
}

 

POJ1845-Sumdiv 北大POJ1845-Sumdiv 解题报告+AC代码 立即下载

相关推荐

Blender - Shrinkwrap - 更方便的制作贴合模型的表面来建模

Shrinkwrap 修改器 使用 Blender 想要快速建模可以贴合现有模型表面的效果:衣服、皮肤、等效果,可以使用 Shrinkwrap 修改器,这个修改器的名字其实按照英文上的理解,翻译为:收缩的包裹效果 应用 如这块铁皮,它要贴合机身弯曲的效果,可以先建好一个铁皮,再 Shrinkwrap 到一个指定的网格上 留意的参数 Target 要贴合的对象(目前我已知是可以贴合到网格对象上,实在是方便) VertexGroup 顶点组,和之前讲到过的,顶点组可以组设顶点的权重,意思这个可.

Jave.Lin 的学习笔记 6070

整数与算法设计基础——整数的基本知识

1.整数与整除算法 1)整除的概念与性质 假设a和b是任意给定的两个整数且a≠0,若存在整数q满足b=a*q,则称a能整除b,或b能被a整除,记为a|b,此时也称a是b的因子或b是a的倍数,反之则相反。 对任意给定的整数a,它至少能够被±1或±a整除,这四个因子也被称为a的平凡因子,a的其他因子被称为非平凡因子 2)素数(质数)与合数 对于任意给定的非零整数a,若a≠±1且没有非平凡因子...

TiAmo17的博客 2140

基于ABCDRez的激光谐振腔设计与热透镜效应仿真实践

本文详细介绍了如何利用ABCDRez代码包进行激光谐振腔设计与热透镜效应仿真。通过ABCD矩阵理论和高斯光束q参数,该工具能有效模拟热透镜动态变化对腔稳定性的影响,指导腔型优化与热补偿设计,是固体激光器预研与调试的高效辅助手段。

weixin_29093017的博客 290

素数分解法

1.对于一个正整数N的素数幂分解N=P1q1P2q2…Pnqn,其中,Pi为素数(1≤i≤n)。1:我们知道了一个正整数N可以分解为素数幂 ,所以我们可以先去用筛子筛出基本的素数。2:对需要分解的数,不断除以素数,得到可以分解的素数及其次数。一:必须知道的一个前置知识。

weixin_54046648的博客 2137

别再用RIDE了!VSCode+RobotFramework插件打造现代化测试开发环境

本文介绍了如何利用VSCode和RobotFramework插件构建现代化的测试开发环境,替代老旧的RIDE工具。详细讲解了环境配置、插件安装、智能代码补全、测试运行与调试等核心功能,帮助开发者提升自动化测试效率。文章还提供了高级技巧、最佳实践和常见问题解决方案,助力团队实现平滑迁移。

weixin_28829629的博客 480

ROS智能车定位导航仿真+功能包自带的地图实现+自己建立的地图实现

ROS智能车定位导航仿真一、前言二、效果图三、准备工作[1.在Ubuntu上安装ROS Kinetic](https://blog.youkuaiyun.com/qq_42585108/article/details/104327661)2.创建ROS工作区间①1创建racecar_ws和src文件夹②初始化工作空间③下载racecar源代码包,并编译工程四、启动仿真1.设置环境变量2.启动地图五、建图1.启动slam和rviz2 控制车辆(左侧有个控制窗口),WASD控制前左后右的运动就可以建图了:3.新建终端保存地

qq_42585108的博客 1万+

素数幂分解

题目描述:在素数系统中,一个数字n被表示为若干个素数幂的乘积,形如:

Peter Parker's blog 2022

VTK API 详解(134):vtkOBJWriter - 写入 OBJ 模型

是 VTK 中用于将数据写入 Wavefront OBJ 文件格式的类。OBJ 格式是广泛支持的 3D 网格模型格式,支持顶点、面和基本几何信息的保存,便于模型在多种三维软件间交换。

yumeiguo的博客 140

【数论】素数

素数: 素数指的是:因子只有  1  和它本身。 素数的分布:   素数分布的应用 例题:素数个数的位数(nefu 117) 题目链接 素数个数的位数 Description 小明是一个聪明的孩子,对数论有着很浓烈的兴趣。他发现求1到正整数10n 之间有多少个素数是一个很难的问题,该问题的难以决定于n 值的大小。现在的问题是,告诉你n的值,让你帮助小明计算小于10n的素数...

Z_sea的博客 1183

Python 爬虫实战:爬取 B 站 UP 主投稿数据,分析更新频率与粉丝互动

摘要:本文基于Python技术实现B站UP主投稿数据的自动化爬取与分析。通过解析B站WBI签名机制和API接口,获取UP主视频的标题、播放量、点赞数等核心数据。采用时间序列分析统计更新频率,结合相关性分析挖掘内容特征与粉丝互动的关联。结果显示编程类视频播放量最高,10-20分钟时长的视频表现最佳,投币数与播放量相关性达0.92。文章详细介绍了接口分析、反爬应对等关键技术,为内容创作者优化策略提供数据支持,同时强调遵守平台规范的爬取原则。

2503_91057718的博客 1537

ZYNQ 网络通信的四种实现方案

一,ZYNQ MIO以RGMII 接口连接外部PHY芯片实现LWIP网络通信。 二,ZYNQ PS 的 ENET0/ENET1 通过 EMIO 的方式扩展至 PL,在 PL 中通过 RGMII 接口连接扩展子卡实现 LWIP 网络通信。 在PL中搭建了1个AXI 1G/2.5G Ethernet Subsystem以及1个AXI Direct Memory Access IP 核。这两个 IP核均通过AXI 总线经S_AXI_HP0 口与PS 连接,PS 通过AXI 总线对其进行配置和控..

wangjie36的博客 1万+

Sumdiv POJ - 1845(快速幂+逆元)

问题虫洞: Sumdiv POJ - 1845 黑洞内窥: 给出A, B,, 求A^B的所有约数之和 sum mod 9901 思维光年: 首先我们要明确三个定理: (1) 整数的唯一分解定理: 任意正整数都有且只有一种方式写出其素因子的乘积表达式。 A=(p1^k1)*(p2^k2)*(p3^k3)*....*(pn^kn) 其中pi均...

浦柳人的博客 385

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

POJ 1845(Sumdiv) 数论好题

Sumdiv Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 19733   Accepted: 4987 Description Consider two natural numbers A and B. Let S be the sum of all nat

大宝哥spring 898

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Linux等比数列脚本求和,POJ 1845 (约数和+二分等比数列求和)

题目大意:A^B的所有约数和,mod 9901.解题思路:①整数唯一分解定理:一个整数A一定能被分成:A=(P1^K1)*(P2^K2)*(P3^K3).....*(Pn^Kn)的形式。其中Pn为素数。如2004=(22)*3*167。那么2004x=(22x)*(3x)*(167x)。②约数和公式对于一个已经被分解的整数A=(P1^K1)*(P2^K2)*(P3^K3).....*(Pn^Kn)...

weixin_42548874的博客 312

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

POJ - 1845 Sumdiv 【约数个数定理 + 约数和定理 + 快速幂 + 逆元】

传送门 必备知识:1 : 约数个数定理: 任意正整数都有且只有一种方式写出其素因子的乘积表达式。 A=(p1^k1)*(p2^k2)*(p3^k3)*....*(pn^kn) 其中pi均为素数 2 : 约数和公式: 对于已经分解的整数A=(p1^k1)*(p2^k2)*(p3^k3)*....*(pn^kn) 有A的所有因子之和为 S = (1+p1+p1^2

Anxdada -- 我等风来也等你 858

POJ 1845 Sumdiv 解题报告(二分 & 逆元)

题目大意:求A^B 所有因数和。     解题报告:公式就不推了,这个链接有详细的推理过程:http://blog.youkuaiyun.com/lyy289065406/article/details/6648539     可以使用二分来求(p^0+p^1+p^2+……+p^n),道理也很简单前一半乘以p^(n/2)就等于后一般,注意奇偶就好了。二分比较好想到,也容易实现,但是用逆元可以更快的求解。

SF-_- 的 ACM 博客 1182

poj 1845 Sumdiv (算术基本定理求一个数因子和)

求一个数的所有因子和可以用算术基本定理,下面是它的两个重要应用:         (1)一个大于1的正整数N,如果它的标准分解式为: N=(P1^a1)*(P2^a2)......(Pn^an)             那么它的正因数个数为(1+a1)(1+a2).....(1+an)。         (2) 它的全体正因数之和为d(N)=(1+p1+...p1^an)(1+p2+...p

crazy__C的专栏 976

POJ 1845-Sumdiv(快速幂取模+整数唯一分解定理+约数和公式+同余模公式)

Sumdiv Time Limit:1000MSMemory Limit:30000KB64bit IO Format:%I64d & %I64u SubmitStatusPracticePOJ 1845 Appoint description: System Crawler (2015-05-27) Description...

weixin_30905133的博客 142

Sumdiv POJ - 1845 (数论)

  Sumdiv POJ - 1845         Consider two natural numbers A and B. Let S be the sum of all natural divisors of A^B. Determine S modulo 9901 (the rest of the division of S by 9901). Input The ...

codeswarrior的博客 791

poj1845 sumdiv 整数唯一分解,等比数列求和或逆元

求a^b的因子和%p题解参考:转载请注明出处:優YoU  http://user.qzone.qq.com/289065406/blog/1309237394应用定理主要有三个:要求有较强 数学思维 的题应用定理主要有三个:(1)   整数的唯一分解定理:      任意正整数都有且只有一种方式写出其素因子的乘积表达式。      A=(p1^k1)*(p2^k2)*(p3^k3)*....*(p...

lengxuenong的博客 343

poj1845 Sumdiv

Sumdiv Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 18488   Accepted: 4674 Description Consider two natural numbers A and B. Let S be the sum of all nat

樱花满地集于我心,楪舞纷飞祈愿相随 372

POJ——1845 Sumdiv (欧拉筛+快速幂+递归二分)

Consider two natural numbers A and B. Let S be the sum of all natural divisors of A^B. Determine S modulo 9901 (the rest of the division of S by 9901). Input The only line contains the two natural n...

lgz0921的博客 254

POJ 1845 (洛谷 :题目待添加)Sumdiv

约数和 题目描述 给出a和b求a^b的约数和。 输入格式: 一行两个数a,b。 输出格式: 一个数表示结果对 9901 的模。 Input 2 3 Output 15 SB的思路: 这是一道典型的数论题,本蒟蒻在做的时候首先瞄出a为质数的解法(简直废话,是个人都看得出), 即sum(a,b)=a^0+a^2+a^3+···+a^(b-1)+a^b,然...

weixin_30687587的博客 167

【世界数学难题】素数判定与大数因子分解问题(上)

序言  数论中一个最基本、最古老而当前仍然受到人们重规的问题就是判别给定的整数是否素数(简称为素数判别或素性判别)和将大合数分解成素因子乘积(简称为大数分解)。在历史上,这个问题曾经吸引了包括费马(Fermat)、欧拉(Euler)、勒让德(Legendre)和高斯(Gauss)在内的大批数学家,他们花费了大量的时间和精力去研究这个问题。高斯在其著名的《算术探讨》(《Disquisitiones

zhouq1986的专栏 9792

【POJ 1845】Sumdiv

题目描述 求 ABABA^B 的所有约数之和 mod9901mod9901\mod 9901。1≤A,B≤5×1071≤A,B≤5×1071≤A,B≤5\times10^7。 算法分析 将 AAA 分解质因数得 A=pc00pc11...PcnnA=p0c0p1c1...PncnA=p_0^{c_0}p_1^{c_1}...P_n^{c_n},则 AB=pc0B0pc1B1...PcnB...

WHZStudio 256
上一篇: POJ 3292 Semi-prime H-numbers 【数学素数筛法】
下一篇: HDU 5128 The E-pang Palace 【暴力】
Y390d
博客等级 码龄9年 11粉丝 165原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值