题目链接: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. FastDFS分布文件系统相关资料索引

    FastDFS是为互联网应用量身定做的一套分布式文件存储系统,非常适合用来存储用户图片.视频.文档等文件.对于互联网应用,和其他分布式文件系统相比,优势非常明显.具体情况大家可以看相关的介绍文档,包括 ...

  2. 用webstorm自动编译less产出css和sourcemap

    css产出sourcemap有什么用呢,可能大家要问这个问题了. 请移步这里 https://developers.google.com/chrome-developer-tools/docs/css ...

  3. Vim快速入门

    学习自:实验楼 Vim具有6种基本模式和5种派生模式 普通模式: vim启动后的默认模式,常用的编辑器命令诸如移动光标,删除文本. 普通模式中,有很多方法进入插入模式,常用 a 或 i 键. 插入模式 ...

  4. Modbus通信协议的压力测试

    最近物联网都比较的火,因此,特别为各位兄弟姐妹们,奉上一款Mobus协议的测试软件,可以用来做设备的压力测试,和通信测试. 起初软件开发缘由是我们最近在开发一款设备,需要将多个DS18B20并联起来, ...

  5. java.sql.SQLException: Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp

    下面是我查询数据库时打印出来的异常信息: ### Error querying database.  Cause: java.sql.SQLException: Value '0000-00-00 0 ...

  6. 01.Nodejs入门之Helloworld

    说明:本文章可供有一定js基础的朋友参考nodejs入门,本文未讲解nodejs的安装,如有需要的同学可以加QQ3382260752找我,进行交流学习. 1.新建文件夹helloworld demo, ...

  7. 【2017-04-01】JS字符串的操作、时间日期的操作、函数、事件、动画基础

    一.字符串的操作 1.转大写: s.toLowerCase(); 2.转大写: s.toUpperCase(); 3.字符串的截取: s.substr(3,4);      -从索引3开始截取,截取4 ...

  8. 使用SevenZipSharp出现“Can not load 7-zip library or internal COM error! Message: DLL file does not exist.”的解决方案

    如果你是从nuget上下载安装的SevenZipSharp库,当你写好相应代码,兴冲冲的启动程序进行测试时,以下画面会让你受到当头一棒: 究其原因,是因为SevenZipSharp只是native 7 ...

  9. Java并发编程:Semaphore、CountDownLatch、CyclicBarrier

    首先我们来实现一个功能:当我们启动一个系统的时候需要初始化许多数据,这时候我们可能需要启动很多线程来进行数据的初始化,只有这些系统初始化结束之后才能够启动系统.其实在Java的类库中已经提供了Sema ...

  10. 修改数据库用户名--CMD环境执行有效

    --CMD环境执行有效 --修改数据库用户名 select * from user$ where name='aa';   update user$ set name='bb' where name  ...