Linux等比数列脚本求和,POJ 1845 (约数和+二分等比数列求和)

题目大意:A^B的所有约数和,mod 9901.

解题思路:

①整数唯一分解定理:

一个整数A一定能被分成:A=(P1^K1)*(P2^K2)*(P3^K3).....*(Pn^Kn)的形式。其中Pn为素数。

如2004=(22)*3*167。

那么2004x=(22x)*(3x)*(167x)。

②约数和公式

对于一个已经被分解的整数A=(P1^K1)*(P2^K2)*(P3^K3).....*(Pn^Kn),

有约数和S=(1+P12+P13+.....P1k1)*.....(1+Pn2+Pn3+.....Pnkn)。

(1+P12+P13+.....P1k1)是一个等比数列,化简为(P1k1+1 -1)/(P1-1),由于有除法同余式,很容易想到乘法逆元。

但是这题和HDU 1452不同,对于逆元表达式ax=1 mod n,乘法逆元存在的条件是gcd(a,n)=1,即a,n互质,但是这题的gcd(P1-1,9901)≠1, 所以不能用乘法逆元求解。

所以有必要对等比数列求和公式改一改:

(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);

这样,在对A质因数分解后,对于每一个质因数,累乘sum(质因数,次数)%mod即可,注意sum计算的时候都要mod防止溢出。

注意一下A的范围,A=0或A=1时无法分解质因数,所以特判结果分别是0和1。

#include "cstdio"

#include "map"

using namespace std;

#define LL long long

#define mod 9901

map prime_factor(LL n)

{

map res;

for(LL i=;i*i<=n;i++)

while(n%i==) {++res[i];n/=i;}

if(n!=) res[n]=;

return res;

}

LL pow(LL a,LL n)

{

LL base=a,ret=;

while(n)

{

if(n&) ret=(ret*base)%mod;

base=(base*base)%mod;

n>>=;

}

return ret%mod;

}

LL sum(LL p,LL n)

{

if(n==) return ;

if(n&) return ((+pow(p,(n>>)+))*sum(p,n>>))%mod;

else return ((+pow(p,(n>>)+))*sum(p,(n-)>>)+pow(p,n>>))%mod;

}

int main()

{

//freopen("in.txt","r",stdin);

LL a,b,res=;

scanf("%I64d%I64d",&a,&b);

if(a==) {printf("0\n");return ;}

map fac=prime_factor(a);

for(map::iterator i=fac.begin();i!=fac.end();i++)

{

LL tmp=sum(i->first,i->second*b)%mod;

res=(tmp*res)%mod;

}

printf("%I64d\n",res);

}

13625416

Accepted

148K

0MS

992B

2014-11-13 12:53:25

POJ 1845 Sumdiv 【二分 &vert;&vert; 逆元】

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

【POJ1845】Sumdiv(数论&sol;约数和定理&sol;等比数列二分求和)

题目: POJ1845 分析: 首先用线性筛把\(A\)分解质因数,得到: \[A=p_1^{a_1}*p_2^{a_2}...*p_n^{a_n} (p_i是质数且a_i>0) \] 则显然\ ...

poj 3233 Matrix Power Series 矩阵求和

http://poj.org/problem?id=3233 题解 矩阵快速幂+二分等比数列求和 AC代码 #include #include

【POJ 1845】 Sumdiv &lpar;整数唯分&plus;约数和公式&plus;二分等比数列前n项和&plus;同余&rpar;

[POJ 1845] Sumdiv 用的东西挺全 最主要通过这个题学了约数和公式跟二分求等比数列前n项和 另一种小优化的整数拆分  整数的唯一分解定理: 随意正整数都有且仅仅有一种方式写出其素因子的乘 ...

poj 1845 【数论:逆元,二分(乘法),拓展欧几里得,费马小定理】

POJ 1845 题意不说了,网上一大堆.此题做了一天,必须要整理一下了. 刚开始用费马小定理做,WA.(poj敢说我代码WA???)(以下代码其实都不严谨,按照数据要求A是可以等于0的,那么结果自然 ...

poj 1845 数论综合

题意:求A^B的所有因数的和 mod 9901 sol:一开始毫无思路,因为很多定理都不知道-_-|| 1. 整数的唯一分解定理: 任意正整数都有且只有一种方式写出其素因子的乘积表达式. A=(p1^ ...

POJ 1845 Sumdiv 【逆元】

题意:求A^B的所有因子之和 很容易知道,先把分解得到,那么得到,那么 的所有因子和的表达式如下 第一种做法是分治求等比数列的和  用递归二分求等比数列1+pi+pi^2+pi^3+...+pi^n: ...

POJ 1845 Sumdiv (求某个数的所有正因子的和)

题意: 求A^B的所有正因子的和,最后模9901的结果. 思路: 若对一个数n进行素数分解,n=p1^a1*p2^a2*p3^a3*...*pk^ak那么n的所有正因子之和sum=(1+p1+...+ ...

poj 1845 POJ 1845 Sumdiv 数学模板

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

随机推荐

Util应用程序框架公共操作类&lpar;十二&rpar;&colon;Lambda表达式公共操作类&lpar;三&rpar;

今天在开发一个简单查询时,发现我的Lambda操作类的GetValue方法无法正确获取枚举类型值,以至查询结果错误. 我增加了几个单元测试来捕获错误,代码如下. /// ...

【转】HTTP中的长连接和短连接分析

1. HTTP协议与TCP/IP协议的关系 HTTP的长连接和短连接本质上是TCP长连接和短连接.HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议.IP协议主要解决网络路由和寻址问 ...

前端框架Bootstrap的Modal使用Ajax数据源&comma;如何避免数据被缓存

1.绑定事件,在关闭的时候,直接将数据清除: $("#model").on("hidden.bs.model",function(e){$(this).remo ...

PHP获取真实的网络IP

function get_client_ip() { $ip = $_SERVER['REMOTE_ADDR']; if (isset($_SERVER['HTTP_CLIENT_IP']) &amp ...

String字符串的操作

字符串的常用操作 # Author:nadech name = "my name is nadech" print(name.count("a")) print ...

Model类代码生成器

using Humanizer; using System; using System.Collections.Generic; using System.Data; using System.Dat ...

ES6对抽象工厂模式与策略模式结合的实践

这段代码是我在学习了java版的抽象工厂模式后,实现的ES6版抽象工厂,后期大幅修改,加入了策略模式,看起来很多逻辑看似繁琐,不必要写这么多,但是为了练习设计模式,所以才这样做.当所需的工厂种类增多后 ...

Ansible test

[root@localmesos ansible_test]# ansible all -a "/bin/echo hello"192.168.111.111 | SUCCESS ...

python软件依赖关系

caffe:numpy,scikit-image opencv:numpy

HttpClient传递Cookie

使用代码访问http资源,我们通常用WebRequest,当然,HttpClient提供了更方便的封装,我用得更多.只是碰到一些需要(cookie)鉴权的情况,需要把cookie伴随请求一起发到服务器 ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值