Codeforces 689C Mike and Chocolate Thieves (二分)
2016-07-10 21:15
302 查看
C. Mike and Chocolate Thieves
time limit per test:2 seconds
memory limit per test:256 megabytes
Bad news came to Mike's village, some thieves stole a bunch of chocolates from the local factory! Horrible!
Aside from loving sweet things, thieves from this area are known to be very greedy. So after a thief takes his number of chocolates for himself, the next thief will take exactly
k times more than the previous one. The value of
k (k > 1) is a secret integer known only to them. It is also known that each thief's bag can carry at most
n chocolates (if they intend to take more, the deal is cancelled) and that there were
exactly four thieves involved.
Sadly, only the thieves know the value of
n, but rumours say that the numbers of ways they could have taken the chocolates (for a fixed
n, but not fixed k) is
m. Two ways are considered different if one of the thieves (they should be numbered in the order they take chocolates) took different number of chocolates in them.
Mike want to track the thieves down, so he wants to know what their bags are and value of
n will help him in that. Please find
the smallest possible value of n or tell him that the rumors are false and there is no such
n.
Input
The single line of input contains the integer
m (1 ≤ m ≤ 1015) — the number of ways the thieves might steal the chocolates, as rumours say.
Output
Print the only integer n — the maximum amount of chocolates that thieves' bags can carry. If there are more than one
n satisfying the rumors,
print the smallest one.
If there is no such n for a false-rumoured
m, print - 1.
Examples
Input
Output
Input
Output
Input
Output
Note
In the first sample case the smallest
n that leads to exactly one way of stealing chocolates is
n = 8, whereas the amounts of stealed chocolates are
(1, 2, 4, 8) (the number of chocolates stolen by each of the thieves).
In the second sample case the smallest
n that leads to exactly 8 ways is
n = 54 with the possibilities: (1, 2, 4, 8), (1, 3, 9, 27), (2, 4, 8, 16), (2, 6, 18, 54), (3, 6, 12, 24), (4, 8, 16, 32), (5, 10, 20, 40), (6, 12, 24, 48).
There is no n leading to exactly
10 ways of stealing chocolates in the third sample case.
题目链接:http://codeforces.com/problemset/problem/689/C
题目大意:给一个数字n,要求结果正好包含n个四元组,求这n个四元组里的最大值,四元组形式为一个等比数列
题目分析:因为只有四个数,显然最后一个是第一个的x^3倍,二分答案,枚举x计算四元组个数即可。
#include <cstdio>
#include <iostream>
#define ll long long
using namespace std;
ll cal(ll x)
{
ll num = 0;
for(ll i = 2; i * i * i <= x; i++)
num += x / (i * i * i);
return num;
}
int main()
{
ll n;
cin >> n;
ll r = 1e18, l = 1, mid, ans = -1;
while(l <= r)
{
mid = (l + r) >> 1;
ll p = cal(mid);
if(p == n)
ans = mid;
if(p >= n)
r = mid - 1;
else
l = mid + 1;
}
cout << ans << endl;
}
time limit per test:2 seconds
memory limit per test:256 megabytes
Bad news came to Mike's village, some thieves stole a bunch of chocolates from the local factory! Horrible!
Aside from loving sweet things, thieves from this area are known to be very greedy. So after a thief takes his number of chocolates for himself, the next thief will take exactly
k times more than the previous one. The value of
k (k > 1) is a secret integer known only to them. It is also known that each thief's bag can carry at most
n chocolates (if they intend to take more, the deal is cancelled) and that there were
exactly four thieves involved.
Sadly, only the thieves know the value of
n, but rumours say that the numbers of ways they could have taken the chocolates (for a fixed
n, but not fixed k) is
m. Two ways are considered different if one of the thieves (they should be numbered in the order they take chocolates) took different number of chocolates in them.
Mike want to track the thieves down, so he wants to know what their bags are and value of
n will help him in that. Please find
the smallest possible value of n or tell him that the rumors are false and there is no such
n.
Input
The single line of input contains the integer
m (1 ≤ m ≤ 1015) — the number of ways the thieves might steal the chocolates, as rumours say.
Output
Print the only integer n — the maximum amount of chocolates that thieves' bags can carry. If there are more than one
n satisfying the rumors,
print the smallest one.
If there is no such n for a false-rumoured
m, print - 1.
Examples
Input
1
Output
8
Input
8
Output
54
Input
10
Output
-1
Note
In the first sample case the smallest
n that leads to exactly one way of stealing chocolates is
n = 8, whereas the amounts of stealed chocolates are
(1, 2, 4, 8) (the number of chocolates stolen by each of the thieves).
In the second sample case the smallest
n that leads to exactly 8 ways is
n = 54 with the possibilities: (1, 2, 4, 8), (1, 3, 9, 27), (2, 4, 8, 16), (2, 6, 18, 54), (3, 6, 12, 24), (4, 8, 16, 32), (5, 10, 20, 40), (6, 12, 24, 48).
There is no n leading to exactly
10 ways of stealing chocolates in the third sample case.
题目链接:http://codeforces.com/problemset/problem/689/C
题目大意:给一个数字n,要求结果正好包含n个四元组,求这n个四元组里的最大值,四元组形式为一个等比数列
题目分析:因为只有四个数,显然最后一个是第一个的x^3倍,二分答案,枚举x计算四元组个数即可。
#include <cstdio>
#include <iostream>
#define ll long long
using namespace std;
ll cal(ll x)
{
ll num = 0;
for(ll i = 2; i * i * i <= x; i++)
num += x / (i * i * i);
return num;
}
int main()
{
ll n;
cin >> n;
ll r = 1e18, l = 1, mid, ans = -1;
while(l <= r)
{
mid = (l + r) >> 1;
ll p = cal(mid);
if(p == n)
ans = mid;
if(p >= n)
r = mid - 1;
else
l = mid + 1;
}
cout << ans << endl;
}
相关文章推荐
- 4.1.2表达式的表示
- 乐乐音乐3.0
- 基于opencv的疲劳驾驶检测中人脸和人眼的检测
- js中文传值乱码
- java实现多线程的一种简单方式
- web 编程的简单学习路线
- android样式开发遇到的小坑
- RxJava 在Android中的应用(二)
- [Linux]Linux命令的英文全称
- js 隐式转换
- Window下安装redis和配置集群
- vim-snipmate编写snippet的语法
- FAQs: 我们可以在那里来为我的没有提升管理权限的应用程序存储用户数据?
- 《OD学hadoop》第三周0710
- 北大校长王恩哥甫的10句话
- Unity5-ABSystem(四):AssetBundle依赖
- 实现函数 functionFunction,调用之后满足如下条件: 1、返回值为一个函数 f 2、调用返回的函数 f,返回值为按照调用顺序的参数拼接,拼接字符为英文逗号加一个空格,即 ', ' 3、所
- android版ape,flac,wav,mp3播放器
- 传球游戏_vijos1485
- 《OD学hadoop》第三周0709