ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

2022.9.3 阿里笔试AK贴

2021-09-03 20:35:36  阅读:204  来源: 互联网

标签:get AK 笔试 t2 2022.9 x2 y2 LL lld


题目

  给定三个正整数a, b, c 请找到满足下面条件的x,y的组数

  1, a <= x^2 <=b  

       2, a <= y^3 <= b

      3, |x^2 - y^3| <= c

其中

1 <= a <= b <= 1e18

0 <= c <= 1e18

 

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
LL maxnum = 1e18;
LL a, b, c;
LL get_2(LL x) {
    LL l = 1, r = 1e9;
    while(l<r) {
        LL mid = (l+r) / 2;
        if(mid * mid < x)
            l = mid + 1;
        else r = mid;
    }
    return l;
}

LL get_3(LL x) {
    LL l = 1, r = 1e6;
    while(l<r) {
        LL mid = (l+r) / 2;
        if(mid * mid * mid < x)
            l = mid + 1;
        else r = mid;
    }
    return l;
}

int main()
{
    cin >> a >> b >> c;
    LL x1 = get_2(a);
    LL x2 = get_2(b);
    if(x2 * x2 > b) x2 --;

    LL y1 = get_3(a);
    LL y2 = get_3(b);
    if(y2 * y2 * y2 > b) y2 --;

    // printf("x: %lld %lld\n", x1, x2);
    // printf("y: %lld %lld\n", y1, y2);

    LL ans = 0;
    for(LL y = y1; y<=y2; y++) {
        LL k1 = max(y * y * y - c, 0LL);
        LL k2 = y * y * y + c;
        if(y * y * y >= maxnum - c)  k2 = maxnum;

        LL t1 = get_2(k1);
        LL t2 = get_2(k2);
        if(t2 * t2 > k2) t2--;

        // printf("t: %lld %lld\n", t1, t2);
        if(t2<x1 || t1>x2) continue;
        else {
            t1 = max(t1, x1);
            t2 = min(t2, x2);
            ans += (t2 - t1 + 1);
        }
    }
    cout << ans << endl;
    return 0;
}

 

标签:get,AK,笔试,t2,2022.9,x2,y2,LL,lld
来源: https://www.cnblogs.com/xidian-mao/p/15224816.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有