题目链接: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大数约数和的更多相关文章

  1. poj1845 Sumdiv

    poj1845 Sumdiv 数学题 令人痛苦van分的数学题! 题意:求a^b的所有约数(包括1和它本身)之和%9901 这怎么做呀!!! 百度:约数和定理,会发现 p1^a1 * p2^a2 * ...

  2. 【题解】POJ1845 Sumdiv(乘法逆元+约数和)

    POJ1845:http://poj.org/problem?id=1845 思路: AB可以表示成多个质数的幂相乘的形式:AB=(a1n1)*(a2n2)* ...*(amnm) 根据算数基本定理可 ...

  3. 约数之和(POJ1845 Sumdiv)

    最近应老延的要求再刷<算法进阶指南>(不得不说这本书不错)...这道题花费了较长时间~(当然也因为我太弱了)所以就写个比较易懂的题解啦~ 原题链接:POJ1845 翻译版题目(其实是AcW ...

  4. POJ1845 Sumdiv [数论,逆元]

    题目传送门 Sumdiv Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 26041   Accepted: 6430 Des ...

  5. POJ1845 Sumdiv(求所有因数和+矩阵快速幂)

    题目问$A^B$的所有因数和. 根据唯一分解定理将A进行因式分解可得:A = p1^a1 * p2^a2 * p3^a3 * pn^an.A^B=p1^(a1*B)*p2^(a2*B)*...*pn^ ...

  6. POJ1845 sumdiv 数论

    正解:小学数学数论 解题报告: 传送门! 其实不难但我数学这个方面太菜了所以还是多写点儿博客趴QAQ 然后因为是英文的所以先翻译一下,,,? 大概就是说求AB的所有约数之和,对9901取膜 这个只需要 ...

  7. poj 1845 Sumdiv(约数和,乘法逆元)

    题目: 求AB的正约数之和. 输入: A,B(0<=A,B<=5*107) 输出: 一个整数,AB的正约数之和 mod 9901. 思路: 根据正整数唯一分解定理,若一个正整数表示为:A= ...

  8. POJ1845 Sumdiv 数学?逆元?

    当初写过一篇分治的 题意:求A^B的所有因子之和,并对其取模 9901再输出 对于数A=p1^c1+p2^c2+...+pn*cn,它的所有约数之和为(1+p1+p1^2+p1^3+...+p1^(c ...

  9. 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)}$ 用一 ...

随机推荐

  1. js简单省级联动菜单

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. Spring+SpringMVC+MyBatis+easyUI整合优化篇(四)单元测试实例

    日常啰嗦 前一篇文章<Spring+SpringMVC+MyBatis+easyUI整合优化篇(三)代码测试>讲了不为和不能两个状态,针对不为,只能自己调整心态了,而对于不能,本文会结合一 ...

  3. 用Caffe生成对抗样本

    同步自我的知乎专栏:https://zhuanlan.zhihu.com/p/26122612 上篇文章 瞎谈CNN:通过优化求解输入图像 - 知乎专栏 中提到过对抗样本,这篇算是针对对抗样本的一个小 ...

  4. Docker镜像压缩

    一.Dockerfile合理分层 Dockerfile的写法不合理,有时候会导致镜像膨胀,由于Docker是分层设计,而在Dockerfile中,每一条指令都拥有自己的context,而执行到下一条指 ...

  5. 老李分享:Uber究竟是用什么开发语言? 2

    Uber的任务分派系统是运行在Node上,这是一个运行在服务器端的JavaScript平台.当一个客户打开app或者网站来进行车辆预定或者调用其他的API来查看可用车辆信息的时候,大部分的这些服务都是 ...

  6. E/MediaPlayer: Should have subtitle controller already set

    原文链接:http://stackoverflow.com/questions/20087804/should-have-subtitle-controller-already-set-mediapl ...

  7. Android IPC机制全解析<一>

    概要 多进程概念及多进程常见注意事项 IPC基础:Android序列化和Binder 跨进程常见的几种通信方式:Bundle通过Intent传递数据,文件共享,ContentProvider,基于Bi ...

  8. 如何在Windows系统下安装Linux虚拟机

    先安装虚拟机这个软件,然后在虚拟机里装linux. 1,准备,下载VM虚拟机,链接: http://pan.baidu.com/s/1z79oU 密码: vbap.和linux镜像文件,可以下载ubu ...

  9. 实现简单的跨站脚本攻击(XSS)

    我们来通俗的了解一下什么是跨站脚本攻击(XSS):在表单中提交 一段 js代码 ,提交的内容被展示到页面时 ,js会被浏览器解析 打个比方吧,比如我现在写的这篇博客,写完以后我要发表对吧? 发表这个过 ...

  10. 跟着刚哥梳理java知识点——泛型(十三)

    一. 泛型概念的提出(为什么需要泛型)? 首先,我们看下下面这段简短的代码: public class GenericTest { public static void main(String[] a ...