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

点击打开链接


解析:

因为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
#include
#include
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;iINF) break;
    }
    while(t--)
    {
        scanf("%llu",&n);
        int kk=lower_bound(ans,ans+MAXN,n)-ans;
        printf("%llu\n",ans[kk]);

    }
    return 0;


}

你可能感兴趣的:(数学题,STL容器)