POJ1845-Sumdiv大数约数和
题目链接:http://poj.org/problem?id=1845
题目大意:
求A^B的所有约数和s。A和B都很大(0<=A,B<=50000000).
题目分析:
这道题让我学会了很多东西,很多我之前没有见识过的专属于数学的技巧之类的。看了别人的博客,受益匪浅。现总结如下:
先来分析一下这道题目,再来讲技巧吧。
这道题真是大数中的大数。刚看到这道题就完全没有头脑。全凭小优的指点(http://blog.csdn.net/lyy289065406) 。
(1) 整数唯一分解定理
任何整数都可以且尽可以分解成若干个素数相乘的形式,如下:
A=p1^k1 * p2^k2 *……* pn^kn;其中的pi各表示一个素数.
(2)约数和公式
按照整数的分解定理,我们有一个整数的约数之和公式为:
S=(1+p1+p1^2+……p1^k1) * (1+p2+p2^2+……+p2^k2) *……* (1+pn+pn^2+……+pn^kn).
(3) 同余模公式
(a+b)%mod=(a%mod + b%mod)%mod;
(a*b)%mod=(a%mod * b%mod)%mod;
*以上的三个数学知识是解这道题的关键。请先消化理解以后再往下面看*
第二部份呢,我们来利用上面的理论基础分析一下这道题。
如果有:A=p1^k1 * p2^k2 *……* pn^kn;
那么有:A^B=p1^(k1*B) * p2^(k2*B) *……* pn^(kn*B);
因而 : S=[1+p1+p1^2+……p1^(k1*B)] * [1+p2+p2^2+……+p2^(k2*B)] *……* [1+pn+pn^2+……+pn^(kn*B)].
至此,答案已经很明了了,下面的事情就是如何来用程序实现上面的过程了,注意,最终的S是要mod 9901 的哦!
*还有什么不明白的吗?可以在讨论区提问哦*
第三部份,我们来尝试用程序实现上述公式:
(1)质因数分解
在这里我用的根号法+递归法(名字是小优那里借鉴的),起初还没想明白这个方法,试图用素数表的方式来解决问题,看到五千万那么大就没有敲了,如果感兴趣,可以自己试一试哦。看一看下面的“根号法+递归法”吧。
for(int i=;i*I<=A;) //根号法的体现
{
int k=;//这是p[ ]和n[ ]的指针。p是存素因子的,n是存其指数
if (A%i==)
{
p[k]=i;
n[k]=;
while(A%i) //这是递归法的体现,找到一个素因子就用此法计算其个数
{
n[k]++;
A/=i;
}
k++;
}
if(i==) //这是所谓的奇偶法,除了2其余素数都是奇数哦
i++;
else
i+=;
} if(A!=)//常规来讲,这时候的A已经被分解剩下1了,除非A本身就是素数
{
p[k]=A;
n[k++]=;
}
* 乍看上去,这也太慢了吧,怎么一个个去试,会不会出现重复啊?会不会把非质数当成是质因子啊?这个问题呢就留给大家自己思考啊。*
(2)二分法求等比数列的和
解决了A的分解问题,自然需要来解决一下S的求解问题,很明显S是一系列以pi为公比的等比数列和 之积。只要能解决等比数列和的问题那这道题就迎刃而解了啊。最最直接的方法是利用求和公式,但是别忘了,我们的S可是还需要对9901取模的,[pi^(ki*B)-1]/(pi-1)这个结果中pi-1未必和9901互素!因而,解决这个问题,就只好用二分法:
对于一个等比数列求和 S=1+q+q^2+……q^n
如果n为奇数,那么一共就有偶数个项了,
S=[1+q+……+q^(n/2)] * [1+q^(n/2+1)]
如果n为偶数,那么一共就是有奇数个项了,
S=[1+q+……+q^(n/2-1] * [1+q^(n/2+1)]+q^(n/2)
*如果记不住上面的公式的话,就举个例子自己算算,结果自然就很清楚了。*
现在所有的理论问题都解决了,就看代码吧。
#include<iostream>
#include<cstdio>
using namespace std;
#define size 10000
#define mod 9901 int p[size],n[size]; long long pow3(long long int a,long long int b )//快速幂
{
long long int r = , base = a;
while( b != )
{
if( b & )
r =(r * base) % mod;
base =(base * base) % mod;
b >>= ;
}
return r;
} long long sum(long long p,long long n)//二分递归求解等比数列之和
{
if(n==)
return ;
if(n%)
return ((sum(p,n/) % mod) * (+pow3(p,n/+))% mod )% mod;
else
return (((sum(p,n/-) % mod) * (+pow3(p,n/+))% mod ) % mod + pow3(p,n/) %mod)%mod;
} int main()
{
int A,B;
while(scanf("%d%d",&A,&B)!=EOF)
{
int js=;
for(int i=;i*i<=A;)//质因数分解A,根号法和递归法
{
if(A%i==)
{
p[js]=i;
n[js]=;
while(A%i==)
{
n[js]++;
A/=i;
}
js++;
}
if(i==)
i++;
else
i+=;
}
if(A!=)//A本身就是素数的
{
p[js]=A;
n[js++]=;
} long long ans=;
for(int i=;i<js;i++)
{
ans=( ans * sum(p[i],n[i]*B)%mod )%mod;
}
cout<<ans<<endl;
}
return ;
}
POJ1845
POJ1845-Sumdiv大数约数和的更多相关文章
- poj1845 Sumdiv
poj1845 Sumdiv 数学题 令人痛苦van分的数学题! 题意:求a^b的所有约数(包括1和它本身)之和%9901 这怎么做呀!!! 百度:约数和定理,会发现 p1^a1 * p2^a2 * ...
- 【题解】POJ1845 Sumdiv(乘法逆元+约数和)
POJ1845:http://poj.org/problem?id=1845 思路: AB可以表示成多个质数的幂相乘的形式:AB=(a1n1)*(a2n2)* ...*(amnm) 根据算数基本定理可 ...
- 约数之和(POJ1845 Sumdiv)
最近应老延的要求再刷<算法进阶指南>(不得不说这本书不错)...这道题花费了较长时间~(当然也因为我太弱了)所以就写个比较易懂的题解啦~ 原题链接:POJ1845 翻译版题目(其实是AcW ...
- POJ1845 Sumdiv [数论,逆元]
题目传送门 Sumdiv Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 26041 Accepted: 6430 Des ...
- POJ1845 Sumdiv(求所有因数和+矩阵快速幂)
题目问$A^B$的所有因数和. 根据唯一分解定理将A进行因式分解可得:A = p1^a1 * p2^a2 * p3^a3 * pn^an.A^B=p1^(a1*B)*p2^(a2*B)*...*pn^ ...
- POJ1845 sumdiv 数论
正解:小学数学数论 解题报告: 传送门! 其实不难但我数学这个方面太菜了所以还是多写点儿博客趴QAQ 然后因为是英文的所以先翻译一下,,,? 大概就是说求AB的所有约数之和,对9901取膜 这个只需要 ...
- poj 1845 Sumdiv(约数和,乘法逆元)
题目: 求AB的正约数之和. 输入: A,B(0<=A,B<=5*107) 输出: 一个整数,AB的正约数之和 mod 9901. 思路: 根据正整数唯一分解定理,若一个正整数表示为:A= ...
- POJ1845 Sumdiv 数学?逆元?
当初写过一篇分治的 题意:求A^B的所有因子之和,并对其取模 9901再输出 对于数A=p1^c1+p2^c2+...+pn*cn,它的所有约数之和为(1+p1+p1^2+p1^3+...+p1^(c ...
- poj1845 sumdiv (因数的和)
首先分解质因数,$A^B=p_1^{m_1B}p_2^{m_2B}...p_n^{m_nB}$ 然后的话,它的所有因数的和就是$\prod{(1+p_i^1+p_i^2+...+p_i^n)}$ 用一 ...
随机推荐
- Java EE基础之JSP(二)
接着上篇文章,我们上篇文章讲到了jsp的基本原理以及和servlet的关系,还介绍了jsp的基本语法部分,本篇文章就继续介绍余下的内容. 编译指令Page和include 基本的动作指令 内置对象 一 ...
- centos6.5 源码安装 gtk 环境
解决 No package 'gtk+-2.0′ found问题方法:yum install libgnomeui-devel 执行了上面的,下面的就可以放弃了,yum 大法好 首先 yum 安装下面 ...
- 读书笔记 effective C++ Item 40 明智而谨慎的使用多继承
1. 多继承的两个阵营 当我们谈论到多继承(MI)的时候,C++委员会被分为两个基本阵营.一个阵营相信如果单继承是好的C++性质,那么多继承肯定会更好.另外一个阵营则争辩道单继承诚然是好的,但多继承太 ...
- [.NET] 一步步打造一个简单的 MVC 电商网站 - BooksStore(三)
一步步打造一个简单的 MVC 电商网站 - BooksStore(三) 本系列的 GitHub地址:https://github.com/liqingwen2015/Wen.BooksStore &l ...
- POPTEST学员就业面试题目!!!!!
POPTEST学员就业面试题目!!!!! poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.(欢迎大家咨询软件测试工程师就业培训 ...
- HashMap源码详解(JDK7版本)
一.内部属性 内部属性源码: //内部数组的默认初始容量,作为hashmap的初始容量,是2的4次方,2的n次方的作用是减少hash冲突 static final int DEFAULT_INITIA ...
- javaScript 基础学习笔记
边看视频和书记得有点杂. 1.插入JS标签 一种是在文档中插入<script></script>标签.另一种是把javaScript代码放在.js文件中.放在head中如. & ...
- Mybatis(四) 高级映射,一对一,一对多,多对多映射
天气甚好,怎能不学习? 一.单向和双向 包括一对一,一对多,多对多这三种情况,但是每一种又分为单向和双向,在hibernate中我们就详细解析过这单向和双向是啥意思,在这里,在重复一遍,就拿一对多这种 ...
- Windows文件路径转换为java中可识别的文件路径的转义方法,(另附转义多种格式)
ps:欢迎加qq好友:2318645572,交流学习 一:路径转化 Windows中的文件路径格式为 D:\eclipse\apache-tomcat-7.0.67\wtpwebapps\... Ja ...
- 基于bootstrap的bootstrap-editable插件实现即时编辑功能
1.引用基本css和js: <link href="bootstrap3/css/bootstrap.min.css" rel="stylesheet" ...