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
思路:因为b^2=2*a*(a+1)^2<=1e19,所以a<=3e6,可以枚举i=sqrt(2*a),那么a=i*i/2,b=(a+1)*i,然后把答案放入数组,输出的时候二分下就行了。注意:数据较大,用unsigned long long。

#include<bits/stdc++.h>
using namespace std;
vector<unsigned long long>ans;
int main()
{
    for(unsigned long long i=0;;i+=2)
    {
        unsigned long long x=i*i/2;
        ans.push_back((x+1)*i);
        if(x*(i+1)>1e19)break;
    }
    int T;cin>>T;
    while(T--)
    {
        unsigned long long n;
        cin>>n;
        int x=lower_bound(ans.begin(),ans.end(),n)-ans.begin();
        cout<<ans[x]<<endl;
    }
    return 0;
}




评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值