POJ - 1845 Sumdiv —— 因子和 等比数列求和

原创 2018年04月16日 22:50:56

Sumdiv
Time Limit: 1000MS Memory Limit: 30000K
Total Submissions: 25199 Accepted: 6244

Description

Consider two natural numbers A and B. Let S be the sum of all natural divisors of A^B. Determine S modulo 9901 (the rest of the division of S by 9901).

Input

The only line contains the two natural numbers A and B, (0 <= A,B <= 50000000)separated by blanks.

Output

The only line of the output will contain S modulo 9901.

Sample Input

2 3

Sample Output

15

Hint

2^3 = 8. 
The natural divisors of 8 are: 1,2,4,8. Their sum is 15. 
15 modulo 9901 is 15 (that should be output). 

题意:给定a和b,求a的b次方的所有因子的和

思路:

由算术基本定理将a拆分成素数的幂积,即a=p1^k1+p2^k2+...pn^kn

则a^b=p1^k1b+p2^k2b+...pn^knb

那么其因子和 (1+p1+p1^2+..p1^k1b)*(1+p2+p2^2+...p2^k2b)*...(1+pn+pn^2+...pn^knb)

 ___ps:不理解的话可以将括号乘进去,运算一下就明白了

要求这个式子,可以把每个括号看成等比数列的前n项和

但是若用前n项和公式求,比较麻烦,会涉及到乘法逆元,我鼓捣了半天没弄出来....

推荐的办法是用递归求其前n项和,理论如下:

①若n为奇数,一共有偶数项,则:

1 + p + p^2 + p^3 +...+ p^n 

= (1 + p + p^2 +...+ p^(n/2)) * (1 + p^(n/2+1))

前半部分恰好就是原式的一半,那么只需要不断递归二分求和就可以了,后半部分为幂次式,用快速幂解。
②若n为偶数,一共有奇数项,则:

1 + p + p^2 + p^3 +...+ p^n

= (1 + p + p^2 +...+ p^(n/2-1)) * (1+p^(n/2+1)) + p^(n/2);

前半部分还是原式的一半

这样求出每个的和加上快速幂就能搞出来了

需要注意的几个坑点:

一是特判a==1的情况

二是分解a的时候,要遍历到根号a下,否则会T,最后再判断一下有没有取因子取尽,没有取尽则最后肯定剩的是个素数

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <cmath>
#include <vector>
#define max_ 50000100
#define inf 0x3f3f3f3f
#define ll long long
#define les 1e-8
#define mod 9901
using namespace std;
ll a,b;
int pl=0;
ll num[100100];
ll cnt[100100];
ll fpow(ll a,ll b)
{
	ll tmp=a%mod;
	ll ans=1;
	while(b)
	{
		if(b&1)
		ans=(ans*tmp)%mod;
		tmp=(tmp*tmp)%mod;
		b/=2;
	}
	return (ans%mod);
}
ll f(ll p,ll n)//求等比数列的前n项和
{
	if(n==0)
	return 1;
	if(n&1)
	return (f(p,n/2)*(1+fpow(p,n/2+1)))%mod;
	else
	return (f(p,n/2-1)*(1+fpow(p,n/2+1))%mod+fpow(p,n/2)%mod)%mod;
}
int main(int argc, char const *argv[]) {
	scanf("%lld%lld",&a,&b);
	if(a==1LL)
	{
		printf("1\n" );
		return 0;
	}
	ll tmp=a;
	int flag=0;
	for(ll i=2;i*i<=a;i++)
	{
		if(tmp%i==0)
		{
			num[++pl]=i;
			flag=1;
		}
		while(tmp%i==0)
		{
			tmp/=i;
			cnt[pl]++;
		}
		if(tmp==1)
		break;
	}
	if(tmp!=1)
	{
		num[++pl]=tmp;
		cnt[pl]=1;
	}
	ll ans=1;
	for(ll i=1;i<=pl;i++)
	{
		ans=(ans*(f(num[i],cnt[i]*b)%mod))%mod;
	}
	printf("%lld\n",ans%mod );
	return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Lngxling/article/details/79967800

poj 1845 Sumdiv 数论--等比数列和(逆元或者递归)

逆元求分数取模代码: #include #include #include #include using namespace std; const int mod=9901; int pow...
  • a601025382s
  • a601025382s
  • 2013-10-02 12:10:14
  • 1530

POJ Sumdiv (数论+二分等比数列求和)

【题目链接】:click here~~ 【题目大意】求 其中sum()表示其所有因子和(0= 【思路】 二分等比数列求和,我们先把A的质因子分解出来,然后如下(poj讨论区的思路~~) 1+p+...
  • u013050857
  • u013050857
  • 2015-09-22 17:11:51
  • 1163

POJ1845-Sumdiv

转载请注明出处:優YoU  http://user.qzone.qq.com/289065406/blog/1309237394   大致题意: 求A^B的所有约数(即因子)之和,并对其取模...
  • lyy289065406
  • lyy289065406
  • 2011-07-31 16:29:30
  • 5936

POJ 1845:Sumdiv 快速幂+逆元

Sumdiv Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 16466   Accepted: 4101 ...
  • u010885899
  • u010885899
  • 2015-09-17 10:41:56
  • 1500

poj1845 Sumdiv

Sumdiv Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 15033   Accept...
  • codeforcer
  • codeforcer
  • 2015-02-02 18:33:40
  • 579

POJ 1845 Sumdiv(求逆元)

Sumdiv Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 17590   Accepted: 4421 ...
  • liangzhaoyang1
  • liangzhaoyang1
  • 2016-04-09 12:52:33
  • 1452

POJ 1845 Sumdiv (因子和)

Sumdiv Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 15404   Accepted: 3800 ...
  • u013068502
  • u013068502
  • 2015-04-25 00:00:32
  • 662

POJ 1845 Sumdiv (因子和)

题目:http://poj.org/problem?id=1845 题意:给定A,B,S为A^B的因子和,求S%9901。 分析:这里给出三种方法。 方法一:首先将A进行素因子分解,...
  • w20810
  • w20810
  • 2015-03-04 18:07:26
  • 359

POJ 1845 Sumdiv (逆元 等比数列求和)

今天我们来探讨逆元在ACM-ICPC竞赛中的应用,逆元是一个很重要的概念,必须学会使用它。   对于正整数和,如果有,那么把这个同余方程中的最小正整数解叫做模的逆元。   逆元...
  • Interstellar_
  • Interstellar_
  • 2017-03-10 19:46:02
  • 198

(POJ1845)Sumdiv <约数和定理 + 快速幂求模 + 二分求等比数列和的模>

Sumdiv DescriptionConsider two natural numbers A and B. Let S be the sum of all natural divisors of...
  • STILLxjy
  • STILLxjy
  • 2016-11-29 19:10:32
  • 404
收藏助手
不良信息举报
您举报文章:POJ - 1845 Sumdiv —— 因子和 等比数列求和
举报原因:
原因补充:

(最多只允许输入30个字)