poj 1845 Sumdiv(约数和,乘法逆元)
题目:
求AB的正约数之和。
输入:
A,B(0<=A,B<=5*107)
输出:
一个整数,AB的正约数之和 mod 9901。
思路:
根据正整数唯一分解定理,若一个正整数表示为:A=p1^c1 * p2^c2 * ...... 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(约数和,乘法逆元)的更多相关文章
- poj 1845 Sumdiv 约数和定理
Sumdiv 题目连接: http://poj.org/problem?id=1845 Description Consider two natural numbers A and B. Let S ...
- poj 1845 Sumdiv (等比求和+逆元)
题目链接:http://poj.org/problem?id=1845 题目大意:给出两个自然数a,b,求a^b的所有自然数因子的和模上9901 (0 <= a,b <= 50000000 ...
- poj 1845 POJ 1845 Sumdiv 数学模板
筛选法+求一个整数的分解+快速模幂运算+递归求计算1+p+p^2+````+p^nPOJ 1845 Sumdiv求A^B的所有约数之和%9901 */#include<stdio.h>#i ...
- HDU 1452 (约数和+乘法逆元)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1452 题目大意:求2004^X所有约数和,结果mod 29. 解题思路: ①整数唯一分解定理: 一个 ...
- POJ 1845 Sumdiv (整数拆分+等比快速求和)
当我们拆分完数据以后, A^B的所有约数之和为: sum = [1+p1+p1^2+...+p1^(a1*B)] * [1+p2+p2^2+...+p2^(a2*B)] *...*[1+pn+pn^2 ...
- POJ 1845 Sumdiv(因子分解+快速幂+二分求和)
题意:给你A,B,让求A^B所有的因子和模上9901 思路:A可以拆成素因子的乘积: A = p1^x1 * p2^x2 *...* pn^xn 那么A^B = p1^(B*x1) * p2^(B*x ...
- POJ 1845 Sumdiv (数学,乘法逆元)
题意: 给出数字A和B,要求AB的所有因子(包括AB和1)之和 mod 9901 的结果. 思路: 即使知道公式也得推算一阵子. 很容易知道,先把分解得到,那么得到,那么的所有因子之和的表达式如下: ...
- POJ 1845 Sumdiv 【二分 || 逆元】
任意门:http://poj.org/problem?id=1845. Sumdiv Time Limit: 1000MS Memory Limit: 30000K Total Submissions ...
- POJ 1845 Sumdiv(逆元)
题目链接:Sumdiv 题意:给定两个自然数A,B,定义S为A^B所有的自然因子的和,求出S mod 9901的值. 题解:了解下以下知识点 1.整数的唯一分解定理 任意正整数都有且只有唯一的方式 ...
随机推荐
- 记CBS一次动人心魄的数据保卫战
接触分布式存储已经有一年多的时间了,首次遇到存储侧三份数据都有异常的情况,三份数据异常意味着客户数据的丢失,这个对云存储来讲是致命的打击.为了保证数据的安全,CBS运维和开发的同学进行了持续两天一夜的 ...
- python 补充:join() , 基本数据类型的增删改查以及深浅拷贝
# join() join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串. li = ["李李嘉诚", "麻花藤", "黄海海峰&q ...
- WCF基础之数据协定
数据协定最重要的当然就是DataContract和DataMember.这两个特性能应用到类.结构和枚举.这个两个特性跟服务契约的特点是一样的,只有被DataContract标记的类和类中被标记Dat ...
- 九度OJ 1335:闯迷宫 (BFS)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1782 解决:483 题目描述: sun所在学校每年都要举行电脑节,今年电脑节有一个新的趣味比赛项目叫做闯迷宫. sun的室友在帮电脑节设计 ...
- [POI2006]SZK-Schools
[POI2006]SZK-Schools luogu #include<bits/stdc++.h> using namespace std; const int N=405,M=1e5+ ...
- Maven下载、安装和配置(转发:http://blog.csdn.net/jiuqiyuliang/article/details/45390313)
准备工作 java开发环境(JDK) maven下载地址:http://maven.apache.org/release-notes-all.html 安装 安装maven超级简单,总共分四步: 下载 ...
- Excel控制IE
---恢复内容开始--- 1.初始化and连接http网页 Set ie = CreateObject("InternetExplorer.Application") ie.Vis ...
- 1django 视图与网址
创建一个项目,名字叫mysite django-admin startproject mysite(项目名) 成功后,看到如下样式 mysite ├── manage.py └── mysite ├─ ...
- ssl和tls
HTTP 是一个网络协议,是专门用来帮你传输 Web 内容 SSL 是Secure Sockets Layer 为啥要发明 SSL 这个协议捏?因为原先互联网上使用的 HTTP 协议是明文的,存在很多 ...
- iOS中成员变量和属性区别
历史由来: 接触iOS的人都知道,@property声明的属性默认会生成一个_类型的成员变量,同时也会生成setter/getter方法. 但这只是在iOS5之后,苹果推出的一个新机制.看老代码时,经 ...