2017年浙江中医药大学大学生程序设计竞赛 - B 一生之敌 (二分)

 

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld

题目描述

大家都知道Alice和Bob两个人是一生之敌。(雾   

但某天,他们两个人发了疯。想知道他们两个是否可以成为朋友。  
于是他们做了一个令人窒息的决定。    
Alice和Bob每个人任意选一个整数。  
假设Alice选择了整数a,Bob选择了整数b。  
Alice使得a做如下变换:  
a -> 2 * a * (a+1)^2
Bob使得b做如下变换:  
b -> b^2
如果变换后的数字相等,则两个人可以化敌为友。  
如果不相等,这两个人怕是石乐志。
现在,你想把Bob部分可能的整数b(存在a变换后的数字等于b变换后的数字)从小到大排列后,知道第一个大于等于n的数字是多少。

 

 

输入描述:

第一行输入一个整数T,表示数据组数。
每组数据输入一个整数n。
1 <= T <= 100000
0 <= n <= 10^19
保证结果存在

输出描述:

输出一个整数。

示例1

输入

3  
2  
6  
100

输出

6
6
114

 

 

 

point:

B可以用A还表示,具体是推出一个公式,然后设一下x,二分遍历x。

坑点:要用ull,以前没用过,得到了教训。

 

 

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
#define LL unsigned long longLL n;
bool check(LL x)
{LL y = x;LL now=2*y*(2*y*y+1);if(now>=n){return true;}return false;
}int main()
{int T;scanf("%d",&T);while(T--){scanf("%llu",&n);LL l=0,r=1440000+100;while(l>1;if(check(mid)){r=mid;}else{l=mid+1;}}LL ans = 2*r*(2*r*r+1);printf("%llu\n",ans);}}

 

 

 

 

 

 

 


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部