题目链接: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. iOS开发之控制器创建与加载(生命周期)

    1.如何创建一个控制器 控制器常见的创建方式有以下几种: (1)通过storyboard创建 (2)直接创建 MJViewController *mj = [[MJViewController all ...

  2. calling c++ from golang with swig--windows dll 二

    Name mangling && Name demangling 在讲述golang如何利用swig调用windows dll之前,需要了解一个概念:Name Mangling (或者 ...

  3. linux ssh -l 命令运用

    ssh是远程登录命令,-l选项是最常用的选项,下面是我的一些总结 远程登录:ssh  -l  userName  ip # 远程登录到 10.175.23.9 ssh -l root2 10.175. ...

  4. 将ROS中的/sensor_msgs/NavSatFix数据导入google earth显示轨迹

    将ros中的gps_msg数据导入google earth显示轨迹 [TOC] 1. 获取GPS数据 将ros中发布的gps topic输出到文本中 rostopic echo -p /gpsData ...

  5. String 类的实现(5)String常用函数

      2 #include<iostream> 3 #include<stdio.h> 4 #include<assert.h> 5 #include <iom ...

  6. POI 操作Excel疑难点笔记

    在POI中,我们可以通过Workbook, Sheet, Row, Cell 对象分别对应Excel文件.工作表.行.单元格. 在POI的使用中,我遇到了几个非常诡异.捉摸不透的问题,现在记录下来. ...

  7. 项目在App Store的展示信息

    一.首部1.图标作用:一个软件的logo.修改:每次提交新版本时可以修改.要求:1>1024*1024像素 2>72dpi.RGB.平展.不透明.没有圆角 3>高品质的JPEG或PN ...

  8. 面试题 ARC

    什么是ARC ?ARC主要解决什么问题? ARC:自动引用计数. 要点..当对象被创建时 retain count+1, 当对象被release时 retain count-1, 当retain co ...

  9. redis skiplist (跳跃表)

    redis skiplist (跳跃表) 概述 redis skiplist 是有序的, 按照分值大小排序 节点中存储多个指向其他节点的指针 结构 zskiplist 结构 // 跳跃表 typede ...

  10. C#小知识点记录,对象的深拷贝

    在CSDN中的定义是: public static string CompareExchange( ref string location1, string value, string compara ...