2014-一生之敌 ZCMU

本文介绍了一道算法竞赛题目,要求在极大范围内快速找出满足特定条件的数列。通过枚举和优化,使用C++实现了一个高效算法,能够处理大量数据组并在规定时间内给出准确答案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Description

 

Input

 第一行输入一个整数T,表示数据组数。   
 每组数据输入一个整数n。

 1 <= T <= 100000 
 0 <= n <= 10^19
 保证结果存在 

Output

 输出一个整数。

Sample Input

3

2

6

100

Sample Output

6

6

114

解析

因为a,b都是整数,而且b^2=2*a*(a+1)^2<=1e19,所以a<2*1e6,同时b=sqrt(2*a)(a+1),可以用i枚举a,2*a=4*i*i ->b=2*i*(2*i*i+1)

因为数据范围极大,所以要用%llu

代码

#include<bits/stdc++.h>
#define MAX 1400005
using namespace std;
unsigned long long ans[MAX],i;
void solve()
{
    for(i=1;i<MAX;i++)
    {
       ans[i]=2*i*(2*i*i+1);
    }
}
int main()
{
    int T;
    unsigned long long n;
    scanf("%d",&T);
    solve();
    while(T--)
    {
        scanf("%llu",&n);
        int temp=lower_bound(ans,ans+MAX,n)-ans;
        printf("%llu\n",ans[temp]);
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值