题目:

  求AB的正约数之和。

输入:

  A,B(0<=A,B<=5*107

输出:

  一个整数,AB的正约数之和 mod 9901。

思路:

  根据正整数唯一分解定理,若一个正整数表示为:A=p1^c* p2^c* ...... pm^cm 则其正约数之和可以表示为:S=(1+p1+p1^2+......p1^c1)*(1+p2+p2^2+......p2^c2)*......(1+pm+pm^2+......pm^cm)

那么AB就可以表示为:S'=(1+p1+p1^2+......p1^(c1*B))*(1+p2+p2^2+......p2^(c2*B))*......(1+pm+pm^2+......pm^(cm*B))

这样,我们发现每一项(以第一项为例)(1+p1+p1^2+......p1^(c1*B))是一个等比数列,根据求和公式易得:(p1^(c1*B+1)-1)/(p1-1)同理,后面的式子也是。那么接下来我们可以通过快速幂求解分子

部分。分母部分需要用到(p1-1)的乘法逆元。因为模数9901是质数,所以只要(p1-1)不是9901的倍数,那么它们就互质,根据费马小定理,乘法逆元就是(p1-2)。特别的,如果(p1-1)是9901

的倍数,那么就有(p1-1)|  9901,即:p1%9901=1,所以这一项就变成了:(1+1+1^2+……+1^(c1*B))%9901=(c1*B)+1 (mod 9901) 。具体代码如下:

#include<cstdio>
const int mod=;
typedef long long ll;
int a,b,ans=;
int factor[],fc[],cnt;
void div(int x)
{
for (int i=;i*i<=x;i++)
{
if (x%i==)
{
factor[++cnt]=i;
while (x%i==) x/=i,fc[cnt]++;
}
}
if (x>) factor[++cnt]=x,fc[cnt]=;
}
int ksm(int a,ll b)
{
int re=;
while (b)
{
if (b&) re=(1ll*re*a)%mod;
a=(1ll*a*a)%mod; b>>=;
}
return re;
}
int main()
{
scanf ("%d%d",&a,&b);
div(a);
for (int i=;i<=cnt;i++)
{
int fac=factor[i];
if ((fac-) % == )//特判分母是否是9901的倍数
{
ans = (ans%mod * (1ll*b*fc[i]+)%mod) % mod;
continue;
}
int fm=( ksm(fac,1ll*b*fc[i]+)-+mod )%mod;//分母
int fzny=( ksm(fac-,mod-) )%mod;//分子逆元
ans = (1ll*ans * fm%mod * fzny%mod)%mod;
}
printf("%d",ans);
return ;
}

poj 1845 Sumdiv(约数和,乘法逆元)的更多相关文章

  1. poj 1845 Sumdiv 约数和定理

    Sumdiv 题目连接: http://poj.org/problem?id=1845 Description Consider two natural numbers A and B. Let S ...

  2. poj 1845 Sumdiv (等比求和+逆元)

    题目链接:http://poj.org/problem?id=1845 题目大意:给出两个自然数a,b,求a^b的所有自然数因子的和模上9901 (0 <= a,b <= 50000000 ...

  3. poj 1845 POJ 1845 Sumdiv 数学模板

    筛选法+求一个整数的分解+快速模幂运算+递归求计算1+p+p^2+````+p^nPOJ 1845 Sumdiv求A^B的所有约数之和%9901 */#include<stdio.h>#i ...

  4. HDU 1452 (约数和+乘法逆元)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1452 题目大意:求2004^X所有约数和,结果mod 29. 解题思路: ①整数唯一分解定理: 一个 ...

  5. POJ 1845 Sumdiv (整数拆分+等比快速求和)

    当我们拆分完数据以后, A^B的所有约数之和为: sum = [1+p1+p1^2+...+p1^(a1*B)] * [1+p2+p2^2+...+p2^(a2*B)] *...*[1+pn+pn^2 ...

  6. POJ 1845 Sumdiv(因子分解+快速幂+二分求和)

    题意:给你A,B,让求A^B所有的因子和模上9901 思路:A可以拆成素因子的乘积: A = p1^x1 * p2^x2 *...* pn^xn 那么A^B = p1^(B*x1) * p2^(B*x ...

  7. POJ 1845 Sumdiv (数学,乘法逆元)

    题意: 给出数字A和B,要求AB的所有因子(包括AB和1)之和 mod 9901 的结果. 思路: 即使知道公式也得推算一阵子. 很容易知道,先把分解得到,那么得到,那么的所有因子之和的表达式如下: ...

  8. POJ 1845 Sumdiv 【二分 || 逆元】

    任意门:http://poj.org/problem?id=1845. Sumdiv Time Limit: 1000MS Memory Limit: 30000K Total Submissions ...

  9. POJ 1845 Sumdiv(逆元)

    题目链接:Sumdiv 题意:给定两个自然数A,B,定义S为A^B所有的自然因子的和,求出S mod 9901的值. 题解:了解下以下知识点   1.整数的唯一分解定理 任意正整数都有且只有唯一的方式 ...

随机推荐

  1. MySQL复制经常使用拓扑结构具体解释

    复制的体系结构有下面一些基本原则: (1)    每一个slave仅仅能有一个master: (2)    每一个slave仅仅能有一个唯一的serverID: (3)    每一个master能够有 ...

  2. 单向HASH——MurmurHash

    //seed 是大质数unsigned long long MurmurHash64B ( const void * key, int len, unsigned int seed ) { const ...

  3. 【BZOJ2790】[Poi2012]Distance 筛素数+调和级数

    [BZOJ2790][Poi2012]Distance Description 对于两个正整数a.b,这样定义函数d(a,b):每次操作可以选择一个质数p,将a变成a*p或a/p, 如果选择变成a/p ...

  4. org.apache.poi3.1.7 Excle并发批量导入导出

    org.apache.poi3.1.7 升级,需要修改设置方式: 1.org.apache.poi3.1.4 的设置单元格: XSSFCellStyle cellStyle = wb.createCe ...

  5. Convex combination

    en.wikipedia.org/wiki/Convex_combination 凸组合 In convex geometry, a convex combination is a linear co ...

  6. JDBC详解2

    day18总结 今日思维导图: 今日内容 事务 连接池 ThreadLocal BaseServlet自定义Servlet父类(只要求会用,不要求会写) DBUtils à commons-dbuti ...

  7. STM32L0 HAL库 UART 串口读写功能

    串口发送功能: uint8_t TxData[]= "01234abcde"; HAL_UART_Transmit(&huart2,TxData,,0xffff);//把T ...

  8. IOS NSDate 调整当前时间戳为明天

    这个可以根据需要调整 在day  month  hour minute second  等都行 以下是以当前时间戳为基础,调整时间为明天的零点零时零分零秒  可以根据需要 写成毫秒的 +(NSStri ...

  9. 培训笔记——ubuntu安装

    1.选择安装位置,如果是做双系统提前准备一个分区,如果覆盖安装就无所谓了2.下载iso镜像文件,制作启动盘,Windows或linux环境下分别有相应的软件可以制作启动光盘或U盘3.开始安装一 设置开 ...

  10. [原创]java WEB学习笔记15:域对象的属性操作(pageContext,request,session,application) 及 请求的重定向和转发

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...