/**
题目:H - Power of Integer
链接:https://vjudge.net/contest/152887#problem/H
题意:给出区间[a, b],问你区间[a, b]所有数的幂的和是多少,定义一个
数的幂是这样的:对于一个数y,存在一个最小的数x,有一个最大的k,使得x^k=y,
那k就是y的幂 思路:看到这种题目容易想到[2,b]-[2,a-1]的做法;
先对[2,b]考虑,因为[2,a-1]同它做法是一样的。一开始我想的是先求x^2<=b 求出最大的满足条件的x,
然后可以计算有多少个幂为2的数在该范围[2,x]内的数的2次方都在[2,b]内。然后再计算x^3<=b的最大的x;然后x^4,x^5,,,,到找不到为止。
但是这样做无法处理重复的情况。
我当时想了很久还是想不到,实在想不到。问了志轩的想法。
他说从高位到低位处理。
假设我求x^12<=b;那么得出一个区间[2,x]范围内的数。对其中某一个数xx^12<=b而这个xx^12是可以分解为(xx^6)^2,(xx^4)^3,(xx^3)^4,(xx^2)^6,(xx^12)^1;
这些可以划分的次方是原来数的约数,不包括本身12;这样就可以提前减去他们产生的贡献。随着幂减少,之后加到他们也不会有影响,因为已经减过了。 代码没有ac,精度问题。
最下面那份代码ac了。 另外做法:利用计算器预处理所有x^2<=10^18,x^3<=10^18,x^4<=10^18....的x值。然后计算的时候就可以控制好,防止溢出了。 */
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;
const double eps = 1e-;
const int maxn = 1e9+;
int sum[];
ll a, b;
//预处理每个数的约数和(不包括自身)
void getSum()
{
sum[] = ;
for(int i = ; i <= ; i++){
for(int j = ; j* <= i; j++){
if(i%j==) sum[i]+=j;
}
}
//test
//printf("%d %d\n",sum[8],sum[9]);
}
//判断是否满足x^y<=b
bool judge(ll x,int y,ll b)
{
ll res = ;
for(int i = ; i <= y; i++){
if(log(res)+log(x)-log(b)>=eps) return false;
res *= x;
}
//return true;
return res<=b;
}
//计算[2,x]范围内的power sum。
ll solve(ll y)
{
if(y<) return ;
//求x^i<=y的x值。
ll ans = ;
for(int i = ; i >= ; i--){
ll mas = ;
ll lo = , hi = b, m;
while(lo<=hi){
m = (lo+hi)/;
if(judge(m,i,y)){//满足条件
lo = m+; mas = max(mas,m);
}else
{
hi = m-;
}
}
//if(mas==1) continue;
//cout<<"mas = "<<mas<<endl;
//cout<<"i = "<<i<<endl;
ans += 1LL*(i-sum[i])*(mas-);
}
return ans;
}
int main()
{
getSum();
while(scanf("%lld%lld",&a,&b)==&&a){
// ll p = 1;
// a = b = p<<59;///
// b+=2;
//cout<<"a = "<<a<<endl;
//cout<<"solve(b) = "<<solve(b)<<endl;
//cout<<"solve(a-1) = "<<solve(a-1)<<endl;
printf("%lld\n",solve(b)-solve(a-));
}
return ;
} ///from zzx
/*
from zzx
思路:由于要找的幂尽量大,所以我们要从高到低来枚举计算幂的贡献
对于幂k 二分一下范围[x,y] 满足a <= x ^ k <= y ^ k <= b
现在就是要去重了
举个例子
2^4 等于16 4^2也等于16 所以算完k为4的贡献后(假设为d),要除掉对k的所有约数的影响(显然影响也为d)
ps: 被 long long 相乘时判溢出 坑了几波,还是取对数靠谱一些
*/
/*
#include<bits/stdc++.h>
#define LL long long
using namespace std;
const double eps = 1e-6;
LL a, b,cnt[64];
bool check1(LL x,int y)
{
LL res = 1;
for(int i = 1; i <= y; i++)
{
if(log(res) + log(x) - log(a) >= eps) return true;
res *= x;
}
return res >= a;
}
LL FindL(int y)
{
LL l = 1,r = b,ans = b;
while(l <= r)
{
LL mid = (l + r) / 2;
if(check1(mid,y)) ans = min(ans,mid),r = mid - 1;
else l = mid + 1;
}
return ans;
}
bool check2(LL x,int y)
{
LL res = 1;
for(int i = 1; i <= y; i++)
{
if(log(res) +log(x) - log(b) > eps) return false;
res *= x;
}
return res <= b;
}
LL FindR(int y)
{
LL l = 1,r = b,ans = 1;
while(l <= r)
{
LL mid = (l + r) / 2;
if(check2(mid,y)) ans = max(ans,mid),l = mid + 1;
else r = mid - 1;
}
return ans;
} int main()
{
while(scanf("%lld%lld",&a,&b)&&(a+b))
{
memset(cnt,0,sizeof(cnt));
LL ans = 0;
for(int i = 63; i >= 1; i--)
{
LL x = FindL(i), y = FindR(i);
LL d = max(y-x+1,0LL);
if(d)
{
d -= cnt[i];
ans += i * d;
if(d)
{
for(int k = 1; k * k <= i; k++)
{
if(i % k == 0){
cnt[k] += d;
if(i/k!=k) cnt[i/k]+=d;
}
}
}
}
}
printf("%lld\n",ans);
}
return 0;
}
*/

hdu3208 Power of Integer的更多相关文章

  1. Android项目中的config.xml文件 “config.xml”

    Android应用程序需要保存一些配置时,可以将这些配置项放置到values/config.xml文件中. 实例分析: <?xml version="1.0" encodin ...

  2. ssm框架整合+Ajax异步验证

    SSM框架是目前企业比较常用的框架之一,它的灵活性.安全性相对于SSH有一定的优势.说到这,谈谈SSM和SSH的不同点,这也是企业常考初级程序员的面试题之一.说到这两套框架的不同,主要是持久层框架Hi ...

  3. 实习小结(三)--- 权限管理(RBAC)

    这一周,大多数时间 用来做需求分析,细化每个页面需要实现的功能.由于这个项目需要四种身份登录查看,分别是学生,老师,领导,管理员.每个身份登入系统显示得页面都不相同,四个角色分析完成后,统计了一下页面 ...

  4. Oracle 常用函数大全

    Oracle 11g 常用函数(Functions)详解 目录 ABS. 3 ACOS. 3 ADD_MONTHS. 4 ASCII 4 ASCIISTR. 5 ASIN.. 5 ATAN.. 5 A ...

  5. Cron表达式,springboot定时任务

    详细请看这篇博客 参考:https://blog.csdn.net/belonghuang157405/article/details/83410197 Cron表达式是一个字符串,字符串以5或6个空 ...

  6. Oracle函数:trunc、round、ceil和floor

    1.trunc函数 1).trunc(date) 格式:trunc(date,fmt) trunc用于截取时间,即便你指定不同的格式类型,返回的类型始终都是时间类型. 示例: with dates a ...

  7. hdu 3208 Integer’s Power 筛法

    Integer’s Power Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  8. HDU 3208 Integer’s Power

    Integer’s Power Time Limit: 1000ms Memory Limit: 32768KB This problem will be judged on HDU. Origina ...

  9. 【HDOJ】3208 Integer’s Power

    1. 题目描述定义如下函数$f(x)$:对于任意整数$y$,找到满足$x^k = y$同时$x$最小并的$k$值.所求为区间$[a, b]$的数代入$f$的累加和,即\[\sum_{x=a}^{b} ...

随机推荐

  1. [Android Traffic] android 流量计算方法

    android流量简介 流量统计文件:路径/proc/net/dev 打开文件,其中 lo 为本地流量, rmnet0 为3g/2g流量, wlan0 为无线流量. 在/sys/class/net/下 ...

  2. Kubernetes dashboard集成heapster

    图形化展示度量指标的实现需要集成k8s的另外一个Addons组件: Heapster . Heapster原生支持K8s(v1.0.6及以后版本)和 CoreOS ,并且支持多种存储后端,比如: In ...

  3. IE11快捷键 双击没反应的解决办法

    WIN + R,regedit,找到 HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main 对左侧树Main节点右键——权限. 正常情 ...

  4. 【转载】网络攻击技术(三)——Denial Of Service & 哈希相关 & PHP语言 & Java语言

    找到了这个系列的原始作者: http://www.cnblogs.com/rush/archive/2012/02/05/2339037.html 最近网络安全成了一个焦点,除了国内明文密码的安全事件 ...

  5. Cobbler安装CentOS 7网卡命名修改

    准备上线CentOS 7.x,在Cobbler上导入后,发现网卡名称变成了eno1这样的,好吧,那就添加两个内核参数上去,让它变回eth0. cobbler profile edit --name=C ...

  6. linux驱动摸索 --驱动框架初始化(结合韦东山视频教程)

    一.驱动框架 初始化:insmod 加载 1.确定主设备号: 分为静态和动态分配,其中LED_GPIO_SIZE 表示支持的次设备号数目,一般默认为1. 相关实现代码如下: int result; d ...

  7. Ubuntu16.04安装Pytorch

    一.安装 1. 官方github:https://github.com/pytorch/pytorch Install optional dependencies //安装依赖项 On Linux e ...

  8. 转:从零开始做app需要做的事情列表

    https://qdan.me/list/VaXl7N8emfv1ayWg 从零开始做App的Bootstrap 做一个App,需要很多东西. 不定期更新. 团队 工欲善其事,必先利其器. 需求管理 ...

  9. C中的C文件与h文件辨析(转)

    简单的说其实要理解C文件与头文件(即.h)有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程:       1.预处理阶段 2.词法与语法分析阶段 3.编译阶段,首先编译成 ...

  10. SQL优化- 数据库SQL优化——使用EXIST代替IN

    数据库SQL优化——使用EXIST代替IN 1,查询进行优化,应尽量避免全表扫描 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引 . 尝试下面的 ...