题意:求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 【逆元】的更多相关文章

  1. poj 1845 POJ 1845 Sumdiv 数学模板

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

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

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

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

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

  4. POJ 1845 Sumdiv(逆元)

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

  5. 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 ...

  6. POJ 1845 Sumdiv(求因数和 + 逆元)题解

    题意:给你a,b,要求给出a^b的因子和取模9901的结果. 思路:求因子和的方法:任意A = p1^a1 * p2^a2 ....pn^an,则因子和为sum =(1 + p1 + p1^2 + . ...

  7. poj 1845 Sumdiv(约数和,乘法逆元)

    题目: 求AB的正约数之和. 输入: A,B(0<=A,B<=5*107) 输出: 一个整数,AB的正约数之和 mod 9901. 思路: 根据正整数唯一分解定理,若一个正整数表示为:A= ...

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

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

  9. poj 1845 Sumdiv 约数和定理

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

随机推荐

  1. S2 易买网总结

    易买网项目总结 --指导老师:原玉明 不知不觉,又到了S2结业的时间了,S1的项目KTV项目还历历在目.一路走来,感觉时间过的好快,我们离就业也越来越近... 展示: 1.主页面(首页) 01.商品分 ...

  2. 解决SlidingMenu和SwipeBackLayout右滑事件冲突问题

    SwipeBackLayout向右滑动关闭当前Activity,SlidingMenu向右滑动则是打开menu部分.在同一个Activity中,当SlidingMenu处于打开状态时,此时向右滑动,事 ...

  3. 我所了解的WEB开发(4) - 神奇的URL

    如果说WEB开发中什么最为神奇的话,我觉得这当属URL了.         URL的启蒙应该是当年的互联网冲浪(surf the Internet),记得当年的电视上宣传互联网冲浪就好似今天对大数据的 ...

  4. ADO.NET 实体类和数据访问类

    SQL数据库字符串注入攻击:需要使用cmd.Parameters这个集合占位符: @key 代表这个位置用这个占位符占住了 Parameters这个集合中将此占位符所代表的数据补全 cmd.Param ...

  5. [.NET] 使用C#开发SQL Function来提供服务 - 简讯发送

    [.NET] 使用C#开发SQL Function来提供服务 - 简讯发送 范例下载 范例程序代码:点此下载 问题情景 在「使用C#开发SQL Function来提供数据 - 天气预报」这篇文章中,介 ...

  6. android 不一样的学习记录

    http://blog.csdn.net/innost/article/details/48228651 ( 深入理解Android 之 Gradle) 介绍:这篇文章篇幅较长,需要有时间并足够有耐心 ...

  7. android Adapter剖析理解

    UI控件都是跟Adapter(适配器)打交道的 Adapter: 是用来帮助控件填充数据的中间桥梁 (在开发中大多数Textview控件的内容是依靠数据库传递并显示的如:新闻类) Adapter: 将 ...

  8. C: const and static keywords

    原文:http://www.noxeos.com/2011/07/29/c-const-static-keywords/ C: const and static keywords Ok, once a ...

  9. python模块基础之json,requeste,xml,configparser,logging,subprocess,shutil。

    1.json模块 json     用于[字符串]和 [python基本数据类型] 间进行转换(可用于不同语言之前转换),json.loads,将字符串转成python的基本数据类型,json.dum ...

  10. 软件快速开发平台 JEPF

    JEPF新一代软件快速开发平台(Java Elephant Platform)是一款优秀的平台产品,它本着灵活.快捷开发.高性能.高协作性.高稳定性.高可用性.人性化的操作体验为设计宗旨历经2年研发成 ...