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)}$ 用一 ...
随机推荐
- Javascript动态创建 style 节点
有很多提供动态创建 style 节点的方法,但是大多数都仅限于外部的 css 文件.如何能使用程序生成的字符串动态创建 style 节点,我搞了2个小时. 静态外部 css 文件语法: @import ...
- Django发送带图片和附件的邮件
最近需要做集团的SRC系统.暂无安全研发,所以只能找我这个小菜兼职开发.系统使用Django框架,在整个过程中,有许多奇特的需求.在某项需求中,需要给厂商用户发送富文本邮件,漏洞详情,这个折腾了一下, ...
- 读Zepto源码之代码结构
虽然最近工作中没有怎么用 zepto ,但是据说 zepto 的源码比较简单,而且网上的资料也比较多,所以我就挑了 zepto 下手,希望能为以后阅读其他框架的源码打下基础吧. 源码版本 本文阅读的源 ...
- AngularJS1.X学习笔记6-控制器和作用域
经过一番艰苦卓绝的鏖战,我终于来到了控制器和作用域部分.控制器作为MVC的C,其重要性不可谓不重要:作用域决定了你可以拿到哪些东西,亦是分外重要.现在就来学习一下两个东西.去看看$apply,$wat ...
- 可以随鼠标拖拽的div
可以拖拽的div <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://ww ...
- 用 config drive 配置网络 - 每天5分钟玩转 OpenStack(173)
上一节最后问了大家一个问题:如果 subnet 没有开 DHCP,会是怎样一个情况? 在其他条件不变的情况下,cloud-init 依然会完成那 3 个步骤,也就是说网卡还是会被配置成 dhcp 模式 ...
- 【Android】XML文件的解析
1.首先我们可以在res包路径下创建一个raw包,然后在raw下创建一个email.xml 文件,并修改其内容如下: <?xml version="1.0" encoding ...
- jmeter、java自动化学习地址
自动化学习社区地址:http://www.hordehome.com/c/14-category jmeter学习地址(范丰平博客):http://www.cnblogs.com/fengpingfa ...
- js的apply()与call()的区别
1.各自对应的不同的语法: /*apply()方法*/ function.apply(thisObj[, argArray]) /*call()方法*/ function.call(thisObj[, ...
- 使用spring利用HandlerExceptionResolver实现全局异常捕获
最近一直没有时间更新是因为一直在更新自己使用的框架. 之后会慢慢带来对之前使用的spring+mvc+mybatis的优化. 会使用一些新的特性,实现一些新的功能. 我会尽量分离业务,封装好再拿出来. ...