Sumdiv POJ - 1845 A^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)].


用递归二分求等比数列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 <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <vector>
#include <map>
#include <cmath>
#include <set>
#include <queue>
using namespace std;

const int INF=1e9+10;
const double EPS = 1e-7;  
typedef long long ll;

ll mypow(ll x,ll k){
	ll sum=1LL;
	while(k){
		if(k&1) sum=1LL*(sum*x)%9901;
		x=1LL*(x*x)%9901;
		k>>=1;
	}
	return sum;
}
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 (1LL*sum(p,n/2)*(1+mypow(p,n/2+1)))%9901;  
    else     //n为偶数  
        return (1LL*sum(p,n/2-1)*(1+mypow(p,n/2+1))+mypow(p,n/2))%9901;  
}
int main(){
	int a,b;
	while(scanf("%d %d",&a,&b)!=EOF){
		ll ans=1LL;
		int m=sqrt(a+0.5);
		for(int i=2;i<=m;){
			if(a%i==0){
				ll cnt=0;
				while(a%i==0) {a/=i;cnt++;}
				ans=(ans*sum(i,1LL*b*cnt)%9901)%9901;
			}
			if(i==2) i++;
			else i+=2;
		}
		if(a>1){
			ans=(ans*sum(a,b)%9901)%9901;
		}
		printf("%lld\n",ans);
	}
	return 0;
}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值