您的位置:首页 > 其它

ZCMUOJ2014: 一生之敌 2017浙江中医药校赛(usigned long long )

2017-12-18 20:20 281 查看
点击打开链接

解析:
因为a,b都是整数,所以最后可以将满足条件的b化简成
b=2*k*(2*k*k+1) k=1,2,3,.....

因为n最大可以到10^19次方
所以要用usigned long long(0-2^128-1)

最后直接用一个STL库里面的函数来二分查找满足条件的值点击打开链接

ForwardIter lower_bound(ForwardIter first, ForwardIter last,const _Tp& val)算法返回一个非递减序列[first, last)中的第一个大于等于值val的位置。
ForwardIter upper_bound(ForwardIter first, ForwardIter last, const _Tp& val)算法返回一个非递减序列[first, last)中的第一个大于值val的位置。

这题也有用大数模板加分块过的。。。但本人没有试过。。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

typedef unsigned long long ull;
const int MAXN = 1400000 + 100;
const ull INF = 1000000000000000000;

ull ans[MAXN];

int main()
{
int t;
scanf("%d",&t);
ull n;
ull i;
for(i=1;i<MAXN;i++)
{
ans[i]=2*i*(2*i*i+1);
//printf("%llu\n",ans[i]);
//if(ans[i]>INF) break;
}
while(t--)
{
scanf("%llu",&n);
int kk=lower_bound(ans,ans+MAXN,n)-ans;
printf("%llu\n",ans[kk]);

}
return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ACM acm模板 stl