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


HDOJ 1339 A Simple Task(简单数学题,暴力)

Problem Description Given a positive integer n and the odd integer o and the nonnegative integer p ...
  • qq_26525215
  • qq_26525215
  • 2016年04月09日 14:30
  • 1381

数学(hdu3208 - Integer’s Power)

Online Judge Online Exercise Online Teaching Online Contests Exercise Author F.A.Q Hand In...
  • u010660276
  • u010660276
  • 2015年05月03日 20:04
  • 623

POJ 3233-Matrix Power Series( S = A + A^2 + A^3 + … + A^k 矩阵快速幂取模)

Matrix Power Series Time Limit: 3000MS   Memory Limit: 131072K Total Submissions: 20...
  • MIKASA3
  • MIKASA3
  • 2016年08月03日 13:42
  • 982

Given an integer, write a function to determine if it is a power of two

Given an integer, write a function to determine if it is a power of two. 判断一个整数是不是2的次方: class Solu...
  • qq_18343569
  • qq_18343569
  • 2015年09月28日 17:08
  • 744

Python语言(四)函数

函数是种抽象技术,将一组操作组合,并命名(也有匿名函数),rho
  • hjx5200
  • hjx5200
  • 2014年08月14日 14:58
  • 1103

Leetcode:326. Power of Three(JAVA)

【题目描述】 Given an integer, write a function to determine if it is a power of three. Follow up:...
  • u010183658
  • u010183658
  • 2016年03月03日 16:51
  • 918

LintCode O(1) Check Power of 2 O(1)检测2的幂次

用 O(1) 时间检测整数 n 是否是 2 的幂次。样例 n=4,返回 true; n=5,返回 false.注意 O(1) 时间复杂度Using O(1) time to check whet...
  • wutingyehe
  • wutingyehe
  • 2015年06月26日 10:58
  • 1711

LeetCode326. Power of Three一行代码解决

Given an integer, write a function to determine if it is a power of three. Follow up: Could you ...
  • booirror
  • booirror
  • 2016年02月16日 21:32
  • 1247

numpy power ValueError: Integers to negative integer powers are not allowed.

# numpy.power(x1,x2) numpy.power(1,-1)这样做是不允许的,只需把x1 = float(x1)就行
  • Addmana
  • Addmana
  • 2017年10月30日 20:29
  • 296

HDOJ 1525 Euclid's Game 博弈

题目大意是给定两个数a,b,Stan always starts.规则是,每次只能把比较大的数减去比较小的数的整数倍,最后两个数中只要有一个数为0就结束,最后操作了的人为胜 首先:对于a,b...
  • HH_YT
  • HH_YT
  • 2013年06月29日 10:07
  • 711
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hdoj Integer’s Power
举报原因:
原因补充:

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