poj1845 Sumdiv

Sumdiv

Time Limit: 1000MS   Memory Limit: 30000K
Total Submissions: 15033   Accepted: 3706

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是素数,我们可以知道a^b的所有因子是1,a,a^2,a^3,...,a^b,

则a^b的所有因子之和为1+a+a^2+a^3+a^4+...+a^b;

如果a不是素数,那么我们可以将a转换为由多个素数组成的合数即a=(p[0]^n[0])*(p[1]^n[1])*(p[2]^n[2])*...*(p[k]^n[k]),(p[0],p[1],p[2],...,p[n]都是素数),

那么a^b转换为p[0]^(n[0]*b) * p[1]^(n[1]*b) * p[2]^(n[2]*b) * ... * p[n]^(n[n]*b),

则所有因子之和为[(1+p[0]+p[0]^2+...+p[0]^(n[0]*b) )*(1+p[1]+p[1]^2+...+p[1]^(n[1]*b) )*...*(1+p[n]+p[n]^2+...+p[n]^(n[n]*b) )

参考代码:

#include <iostream>
#include <stdio.h>
#include <string.h>
typedef long long ll;
using namespace std;
#define m 9901
ll mod_pow(ll a,ll b){	//快速幂
	ll ans=1;
	while (b>0){
		if (b&1)
			ans=ans*a%m;
		a=a*a%m;
		b>>=1;
	}
	return ans;
}
ll sum(ll p,ll n)  //递归二分求 (1 + p + p^2 + p^3 +...+ p^n)%mod
{                          //奇数二分式 (1 + p + p^2 +...+ p^(n/2)) * (1 + p^(n/2+1))
    if(n==0)               //偶数二分式 (1 + p + p^2 +...+ p^(n/2-1)) * (1+p^(n/2+1)) + p^(n/2)
        return 1;
    if(n%2)  //n为奇数,
        return (sum(p,n/2)*(1+mod_pow(p,n/2+1)))%m;
    else     //n为偶数
        return (sum(p,n/2-1)*(1+mod_pow(p,n/2+1))+mod_pow(p,n/2))%m;
}
/*
ll sum(ll a,ll b){	//求 1+a^1+a^2+...+a^b的值
	ll ans=mod_pow(a,b+1);
	return (ans-1)/(a-1);
}
*/
int main(){
	int a,b;
	int p[10000],n[10000];
	while (cin>>a>>b){
		int k=0;
		memset(n,0,sizeof(n));
		for (int i=2;i<=a;i++){	//将a转换为(p[0]^n[0])*(p[1]^n[1])*(p[2]^n[2])*...*(p[k]^n[k])
			if (a%i==0){
				p[k]=i;
				while (a%i==0){
					n[k]++;
					a/=i;
				}
				k++;
			}
		}
		ll ans=1;
		for (int i=0;i<k;i++){
			ans=ans*sum(p[i],b*n[i])%m;
		}
		cout<<ans<<endl;
	}
	return 0;
}
时间: 2024-10-16 22:06:58

poj1845 Sumdiv的相关文章

POJ1845 Sumdiv - 乘法逆元+快速幂【A^B的约数个数和】

POJ1845 Sumdiv Sol: 约数个数和\(sumdiv=(1+p_1+p_1^2+\dots + p_1^{c_1})*\dots *(1+p_k+p_k^2+\dots + p_k^{c_k})\) 其中每一项都是一个首项为1,公比为\(p_i\)的等比数列的和,即 \(1*\frac{1-p_i^{c_{k}+1}}{1-p_i}=\frac{p_i^{c_{k}+1}-1}{p_i-1}\) 可以通过快速幂+逆元求解. 然而,当\(9901|(p_i-1)\)时,\(p_i-1

【题解】POJ1845 Sumdiv(乘法逆元+约数和)

POJ1845:http://poj.org/problem?id=1845 思路: AB可以表示成多个质数的幂相乘的形式:AB=(a1n1)*(a2n2)* ...*(amnm) 根据算数基本定理可以得约数之和sum=(1+a1+a12+...+a1n1)*(1+a2+a22+...+a2n2)*...*(1+am+am2+...+amnm) mod 9901 对于每个(1+ai+ai2+...+aini) mod 9901=(ai(ni+1)-1)/(ai-1) mod 9901 (等比数列

POJ1845 Sumdiv(求所有因数和+矩阵快速幂)

题目问$A^B$的所有因数和. 根据唯一分解定理将A进行因式分解可得:A = p1^a1 * p2^a2 * p3^a3 * pn^an.A^B=p1^(a1*B)*p2^(a2*B)*...*pn^(an*B);A^B的所有约数之和sum=[1+p1+p1^2+...+p1^(a1*B)]*[1+p2+p2^2+...+p2^(a2*B)]*[1+pn+pn^2+...+pn^(an*B)] 知道这个,问题就变成求出A的所有质因数pi以及个数n,然后$\prod(1+p_i+p_i^2+\cd

2018.11.6刷题记录

数论基本糙作: gcd,快速幂,逆元,欧拉函数,分解因数balabala一通乱搞. POJ1845 Sumdiv (数论:算数基本定理+数论基本操作) 题目: Sumdiv Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 29012 Accepted: 7127 Description Consider two natural numbers A and B. Let S be the sum of all natural d

POJ1845:Sumdiv(求因子和+逆元+质因子分解)好题

题目链接:http://poj.org/problem?id=1845 定义: 满足a*k≡1 (mod p)的k值就是a关于p的乘法逆元. 为什么要有乘法逆元呢? 当我们要求(a/b) mod p的值,且a很大,无法直接求得a/b的值时,我们就要用到乘法逆元. 我们可以通过求b关于p的乘法逆元k,将a乘上k再模p, 即(a*k) mod p.其结果与(a/b) mod p等价. 题目解析:让求a^b的因子和modk,因为是大数没法直接求,因为求因子和函数是乘性函数,所以首先要质因子分解,化成n

Sumdiv 等比数列求和

Sumdiv Sumdiv Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 15364   Accepted: 3790 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

POJ 1845 Sumdiv (快速幂+质因数+约数和公式+同余模)

Sumdiv Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 16109   Accepted: 3992 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 99

【POJ 1845】 Sumdiv (整数唯分+约数和公式+二分等比数列前n项和+同余)

[POJ 1845] Sumdiv 用的东西挺全 最主要通过这个题学了约数和公式跟二分求等比数列前n项和 另一种小优化的整数拆分  整数的唯一分解定理: 随意正整数都有且仅仅有一种方式写出其素因子的乘积表达式. A=(p1^k1)*(p2^k2)*(p3^k3)*....*(pn^kn)   当中pi均为素数 约数和公式: 对于已经分解的整数A=(p1^k1)*(p2^k2)*(p3^k3)*....*(pn^kn) 有A的全部因子之和为 S = (1+p1+p1^2+p1^3+...p1^k1

POJ 1845 Sumdiv(逆元的应用)

传送门 Sumdiv Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 19009 Accepted: 4773 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 99