牛客网 NC14520 有趣的数学 暴力枚举

1. 题目描述

1.1. Limit

Time Limit: C/C++ 1秒,其他语言2秒
Memory Limit: C/C++ 32768K,其他语言65536K

1.2. Problem Description

在刚刚过去的双11,对于别人来说是一个购物的节日,然而对于CJJ来说,确是一个单身狗的光棍节,所以他只能一个人默默的刷题。

现在,CJJ学长遇到了一个数学问题,如果一个数的三次方的后两位是11,那么他将其称之为“单身数”,他知道了第一个“单身数”是71,CJJ学长想知道第 n n 个“单身数”是多少。

1.3. Input

输入一个正整数 T ( T 100 ) T(T\le100) ,表示有 T T 组数据,每组数据包括一个整数 n ( 1 n 1000000 ) n(1 \le n \le 1000000)

1.4. Output

输出第 n n 个“单身数”。

1.5. Sample Input

1
1

1.6. Sample Output

71

1.8. Source

牛客网 NC14520 有趣的数学

2. 解读

先枚举第 1 e 6 1e6 个单身数,发现其为 99999971 99999971 ,也就是一共需要大概 1 e 8 1e8 次的运算,可以进行暴力求解。

但是直接暴力会发现通过不了,因为 long long 的最大值为 9223372036854775807 9223372036854775807 , 也就是 9.223372 × 1 0 18 9.223372 \times 10 ^ {18} ,然而 9999997 1 3 = 999999130000252299975611 99999971 ^3 = 999999130000252299975611 ,也就是 9.999991 × 1 0 23 9.999991 \times 10 ^ {23} ,超出了 long long 的取值范围。

所以我们在计算三次方时要对结果取模,防止溢出。因为我们考虑的是后两位,对 100 100 取模即可。

扫描二维码关注公众号,回复: 11591752 查看本文章

3. 代码

#include <iostream>
using namespace std;
const int MAXN = 1e6 + 1;
long long list[MAXN];
int main()
{
    long long count = 0, buffer = 0;
    // 先计算前1e6个单身数并存储
    for (long long i = 0;; i++) {
        buffer = ((i * i) % 100 * i) % 100;
        if (buffer % 10 == 1 && buffer / 10 % 10 == 1) {
            list[count++] = i;
            if (count >= MAXN - 1)
                break;
        }
    }
    int t, n;
    cin >> t;
    while (t--) {
        cin >> n;
        cout << list[n - 1] << endl;
    }
}

联系邮箱[email protected]

CSDNhttps://me.csdn.net/qq_41729780

知乎https://zhuanlan.zhihu.com/c_1225417532351741952

公众号复杂网络与机器学习

欢迎关注/转载,有问题欢迎通过邮箱交流。

猜你喜欢

转载自blog.csdn.net/qq_41729780/article/details/107509176