hdoj Integer’s Power

原创 2012年03月31日 12:08:28

来源:2009 Shanghai Invitation Contest Host by DHU

思路:sum[a, b] = sum[2, b] - sum[2,a-1].

枚举指数i,计算出在区间内可以表示成p^i的个数。值得注意的是若在区间[2, 64]内,i = 2时,a[2] = 7(2,3,4,5,6,7,8),其中4,8不应包含在内,因为4^2= 2^4,8^2=2^6,所以在最后计算i次方个数的时候需要把i次方的倍数个数剪掉。

#include<stdio.h>
#include<string.h>
#include<math.h>
#include <iostream>

using namespace std;

typedef __int64 lint;

lint ar[200],br[200], a[200];
const double eps = 1e-6;
lint n,m;

lint solve() {
    lint p, i, j, tmp, cnt;
    cnt = 0;
    memset(ar,0,sizeof(ar));
    memset(br,0,sizeof(br));
    memset(a,0,sizeof(a));
    tmp = m;
    while (tmp) {
        cnt++;
        tmp >>= 1;
    }
    if (n == m) {
        i = cnt;
        for (; i>0; i--) {
            if(i == 1)
                return 1;
            p = (lint)pow(n*1.0, 1.0/i+eps);
            tmp = 1;
            j = i;
            while(j--) {
                tmp *= p;
            }
            if (tmp == n)
                return i;
        }
    }
    else {
        i = cnt;
        for (; i > 0; --i) {
            if (i == 1) {
                ar[1] = m;
                br[1] = n -1;
            }
            else {
                p = (lint)pow(n*1.0, 1.0/i+eps);
                while (1) {
                    j = i;
                    tmp = 1;
                    while(j--) {
                        tmp *= p;
                    }
                    if (tmp < n) {
                        br[i] = p;
                        break;
                    }
                    else {
                        p--;
                    }
                }
                p = (lint)pow(m*1.0, 1.0/i+eps);
                j = i;
                while (1) {
                    tmp = 1;
                    j = i;
                    while (j--) {
                        tmp *= p;
                    }
                    if (tmp <= m) {
                        ar[i] = p;
                        break;
                    }
                    else p--;
                }
            }
        }
        for (i = cnt; i > 0; --i) {
            a[i] = ar[i] - br[i];
            for (j = i + i; j <= cnt; j += i)
                a[i] -= a[j];
        }
        lint sum = 0;
        for (i = 1; i <= cnt; ++i)
            sum += i*a[i];
        return sum;
    }
}

int main()
{
    while (scanf("%I64d%I64d",&n,&m)!=EOF) {
        if(n==0&&m==0)
            break;
        printf("%I64d\n", solve());
    }
    return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

组合数学 C(n,k)

求C(n,k)的方法很多,这里只介绍打表的方法.递推式:C(n,k) = C(n-1,k-1) + C(n-1,k)代码:#include using namespace std; const ...

开发Wap 中的随笔

以下是在开发wap中的随笔,其中一些对于“老鸟”来说,谈不上什么,希望对初学者有所帮助,大家有什么小技巧,欢迎顶上来。共同学习、共同进步 ^-^1、iis配置Wap环境在作为wap站点的属性-->Ht...

hdoj Buy the Ticket

算法分析: 首先假设人无区别 令f(m,n)表示有m个人手持¥50的钞票,n个人手持¥100的钞票时共有的方案总数。则可以分以下情况讨论这个问题: (1)当n=0时   n=0意味着排队购票的所...

HDU 5528 Count a × b 纪念长春站的遗憾

18日的长春现场赛已经过去4天。虽然说拿到学校的首届银牌还是很值得高兴的,但B题作为这场比赛唯一的数论题,由于时间不够未能AC我实在是感到遗憾。最后半个小时我只推公式推到了sqrt分解log求约数再处...

poj 2480

设函数g(n) = gcd(i,n) (11时 n=p1^a1*p2^a2*...*ps^as,那么f(n)是积性函数的充要条件是f(1)=1,及f(n) = f(p1^a1)*f(p2^a2)*.....

HDU 5531 Rebuild 相切的圆们

终于迎来了长春的重现。赛场上太多的遗憾,比赛的时候唯一看都没看一眼的题就是这个题,太可惜了。连同B题一起,为了抢个FB对不住打重现赛的童鞋们了。。。。。求放过,也不知道这个时候写题解算不算违规呢哈哈。...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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