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;
}


HDU 3208 Integer’s Power 指数和、容斥

题意: 输入l,r,求出[l, r]区间内,表示成指数形式的指数和。 要求a^b,a尽量小,b尽量大。例如,16应该表示成2^4,而不是4^2。 思路: 参考自:http://blog.csd...

HDOJ3663-Power Stations,DLX精确覆盖

//********************* //Source: HDOJ 3663 //Method: Dancing links //Author: yihuikang //**********...

hdoj 1047 Integer Inquiry(几个大数连续加)

Integer Inquiry Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)...

hdoj1047 Integer Inquiry(大整数的相加)

思路很简单,但感觉我做复杂了(┬_┬) 其实可以直接写一个两个大整数相加的函数,输入一个大整数就加一次。而我直接就输入所有数据,然后对全部数据一起处理,不仅耗费内存还耗费时间。 我的代码: #i...
  • CqZtw
  • CqZtw
  • 2017年06月01日 20:38
  • 112

HDOJ 1047 Integer Inquiry

Integer Inquiry Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

HDOJ 1047 Integer Inquiry (多个大数求和)

HDOJ 1047 Integer Inquiry (多个大数求和) 思路:定义一个 s 数组保存 和,每输入一次与 s 求和,把 数组 s 也看成一个大数,这样就相当于 大数 a + b...

POJ 3233 Matrix Power Series 求S = A + A2 + A3 + … + Ak.

求:S = A + A2 + A3 + … +Ak. 第一次代码:二分直接递归,很好理解。1250MS #include #define SIZE (1...
  • Tsaid
  • Tsaid
  • 2012年03月10日 12:39
  • 456

the power of IT (it’s not all in energy consumption

In its series on data centers and power the New York Times ignored many of the strides the industry ...

Integer.parseInt(String s, int radix)的用法

源自JDK API文档 1.6 java.lang 类 Integer java.lang.Object java.lang.Number java.lang.Integer ...

Integer.parseInt(String s, int radix)方法介绍(修正版)

Integer.parseInt(String s, int radix)就是将字符串s转换成radix进制的整数,显然前提是s为整数字符串。比如 s可以为“1314520”、“5201314”等。不...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hdoj Integer’s Power
举报原因:
原因补充:

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