POJ 1845 Sumdiv 【逆元】
题意:求A^B的所有因子之和
很容易知道,先把分解得到
,那么得到
,那么
的所有因子和的表达式如下
第一种做法是分治求等比数列的和
用递归二分求等比数列1+pi+pi^2+pi^3+...+pi^n:
(1)若n为奇数,一共有偶数项,则:
1 + p + p^2 + p^3 +...+ p^n
= (1+p^(n/2+1)) + p * (1+p^(n/2+1)) +...+ p^(n/2) * (1+p^(n/2+1))
= (1 + p + p^2 +...+ p^(n/2)) * (1 + p^(n/2+1))
(2)若n为偶数,一共有奇数项,则:
1 + p + p^2 + p^3 +...+ p^n
= (1+p^(n/2+1)) + p * (1+p^(n/2+1)) +...+ p^(n/2-1) * (1+p^(n/2+1)) + p^(n/2)
= (1 + p + p^2 +...+ p^(n/2-1)) * (1+p^(n/2+1)) + p^(n/2);
其他用到的知识是素数筛选以及快速幂,本博客都有相应知识或者百度也行
#include<stdio.h>
#include<string.h>
typedef long long ll;
const int mod=;
const int N=1e5+;
int p[N],pr[N],cnt;
void init(){
for(int i=;i<N;i++){
if(!p[i]) pr[++cnt]=i;
for(int j=;j<=cnt&&i*pr[j]<N;j++){
p[i*pr[j]]=;
if(i%pr[j]==) break;
}
}
}
ll pow_m(ll a,ll b,ll m){
ll ans=;a%=m;
while(b){
if(b&)
ans=(ans*a)%m;
a=(a*a)%m;
b>>=;
}
return ans;
}
ll sum(ll p,ll n){
if(!n) return ;
if(n&){
return (sum(p,n/)*(+pow_m(p,n/+,mod)))%mod;
}
else{
return (sum(p,n/-)*(+pow_m(p,n/+,mod))+pow_m(p,n/,mod))%mod;
}
}
int main(){
ll a,b;
init();
while(~scanf("%lld%lld",&a,&b)){
ll ans=;
for(int i=;i<=cnt&&pr[i]*pr[i]<=a;i++){
if(a%pr[i]==){
int num=;
while(a%pr[i]==){
num++;
a/=pr[i];
}
ans=(ans*sum(pr[i],num*b))%mod;
}
}
if(a>){
ans=(ans*sum(a,b))%mod;
}
printf("%lld\n",ans);
}
return ;
}
第二种方法就是用等比数列求和公式,但是要用逆元。用如下公式即可(已知a|b)
我们来证明它,已知,证明步骤如下
在快速幂时的乘法会爆longlong,所以用快速乘
#include<stdio.h>
#include<string.h>
typedef long long ll;
const int mod=;
const int N=1e5+;
int p[N],pr[N],cnt;
void init(){
for(int i=;i<N;i++){
if(!p[i]) pr[++cnt]=i;
for(int j=;j<=cnt&&i*pr[j]<N;j++){
p[i*pr[j]]=;
if(i%pr[j]==) break;
}
}
}
ll mul(ll a,ll b,ll m){
ll ans=;a%=m;
while(b){
if(b&)
ans=(ans+a)%m;
a=(a+a)%m;
b>>=;
}
return ans;
}
ll pow_m(ll a,ll b,ll m){
ll ans=;a%=m;
while(b){
if(b&)
ans=mul(ans,a,m);
a=mul(a,a,m);
b>>=;
}
return ans;
}
int main(){
ll a,b;
init();
while(~scanf("%lld%lld",&a,&b)){
ll ans=;
for(int i=;i<=cnt&&pr[i]*pr[i]<=a;i++){
if(a%pr[i]==){
int num=;
while(a%pr[i]==){
num++;
a/=pr[i];
}
ll M=(pr[i]-)*mod;
ans*=(pow_m(pr[i],num*b+,M)+M-)/(pr[i]-);
ans%=mod;
}
}
if(a>){
ll M=(a-)*mod;
ans*=(pow_m(a,b+,M)+M-)/(a-);
ans%=mod;
}
printf("%lld\n",ans);
}
return ;
}
http://blog.csdn.net/lyy289065406/article/details/6648539
http://blog.csdn.net/acdreamers/article/details/8220787
POJ 1845 Sumdiv 【逆元】的更多相关文章
- poj 1845 POJ 1845 Sumdiv 数学模板
筛选法+求一个整数的分解+快速模幂运算+递归求计算1+p+p^2+````+p^nPOJ 1845 Sumdiv求A^B的所有约数之和%9901 */#include<stdio.h>#i ...
- POJ 1845 Sumdiv 【二分 || 逆元】
任意门:http://poj.org/problem?id=1845. Sumdiv Time Limit: 1000MS Memory Limit: 30000K Total Submissions ...
- poj 1845 Sumdiv (等比求和+逆元)
题目链接:http://poj.org/problem?id=1845 题目大意:给出两个自然数a,b,求a^b的所有自然数因子的和模上9901 (0 <= a,b <= 50000000 ...
- POJ 1845 Sumdiv(逆元)
题目链接:Sumdiv 题意:给定两个自然数A,B,定义S为A^B所有的自然因子的和,求出S mod 9901的值. 题解:了解下以下知识点 1.整数的唯一分解定理 任意正整数都有且只有唯一的方式 ...
- Sumdiv POJ - 1845 (逆元/分治)
Consider two natural numbers A and B. Let S be the sum of all natural divisors of A^B. Determine S m ...
- POJ 1845 Sumdiv(求因数和 + 逆元)题解
题意:给你a,b,要求给出a^b的因子和取模9901的结果. 思路:求因子和的方法:任意A = p1^a1 * p2^a2 ....pn^an,则因子和为sum =(1 + p1 + p1^2 + . ...
- poj 1845 Sumdiv(约数和,乘法逆元)
题目: 求AB的正约数之和. 输入: A,B(0<=A,B<=5*107) 输出: 一个整数,AB的正约数之和 mod 9901. 思路: 根据正整数唯一分解定理,若一个正整数表示为:A= ...
- POJ 1845 Sumdiv (数学,乘法逆元)
题意: 给出数字A和B,要求AB的所有因子(包括AB和1)之和 mod 9901 的结果. 思路: 即使知道公式也得推算一阵子. 很容易知道,先把分解得到,那么得到,那么的所有因子之和的表达式如下: ...
- poj 1845 Sumdiv 约数和定理
Sumdiv 题目连接: http://poj.org/problem?id=1845 Description Consider two natural numbers A and B. Let S ...
随机推荐
- 【FFmpeg】ffplay播放rtsp视频流花屏问题
问题描述:ffplay播放rtsp视频流时,播放过程中随机出现花屏现象. 基本流程学习:阅读ffplay源码,熟悉其播放rtsp视频流的基本流程. 在ffplay源码阅读和分析的基础上,画出了其播放r ...
- [CLK Framework] CLK.Settings - 跨平台的参数存取模块
[CLK Framework] CLK.Settings - 跨平台的参数存取模块 问题情景 开发功能模块的时候,常常免不了有一些参数(例如ConnectionString),需要存放在Config檔 ...
- VS 2013 Preview 自定义 SharePoint 2013 列表 之 两个Bug
SharePoint 2013 已RTM了,对于程序员来说又要了解新功能了,同时 VS 2013 也将要 RTM了,两者同时应用定会有不新功能,我们先从 自定义 列表开始. SharePoint 20 ...
- HTML5中的音视频处理
* 音视频处理 * 视频处理 * 基本内容 * 使用Flash技术处理HTML页面中的视频内容 * 包含音频.动画.网页游戏等 * 特点 * 浏览器原生不支持(IE浏览器要求安装ActiveX组件) ...
- 转:在浏览器地址栏按回车、F5、Ctrl+F5刷新网页的区别
转:http://www.cnblogs.com/mofish/archive/2012/06/08/2541604.html 不少同学问,不都是刷新吗?还有什么区别?其实,还是有的. 其中,在地址栏 ...
- WEB程序调用客户端程序
最近一个项目中要点击WEB页面上的链接启动自己编写的程序,而且还要接收参数,google了1.5小时,终于初步试验通过了. 尝试google了:web send message windows for ...
- 【转载】iOS堆和栈的理解
操作系统iOS 中应用程序使用的计算机内存不是统一分配空间,运行代码使用的空间在三个不同的内存区域,分成三个段:“text segment “,“stack segment ”,“heap segme ...
- 推导大O阶方法
用大写O()来体现算法时间复杂度的记法,我们称之为大O阶记法. O(1)叫做常数阶:O(n)叫做线性阶:O(n^2)叫做平方阶. 1.用常数1取代运行时间中的所有加法常数. 2.在修改后的运行次数函 ...
- Retrofit源码设计模式解析(上)
Retrofit通过注解的方法标记HTTP请求参数,支持常用HTTP方法,统一返回值解析,支持异步/同步的请求方式,将HTTP请求对象化,参数化.真正执行网络访问的是Okhttp,Okhttp支持HT ...
- LCS修改版(Longest Common Subsequence 最长公共子序列)
题目描述 作为一名情报局特工,Nova君(2号)有着特殊的传达情报的技巧.为了避免被窃取情报,每次传达时,他都会发出两句旁人看来意义不明话,实际上暗号已经暗含其中.解密的方法很简单,分别从两句话里删掉 ...