文章目录
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 n 个“单身数”是多少。
1.3. Input
输入一个正整数 T ( T ≤ 100 ) T(T\le100) T(T≤100),表示有 T T T 组数据,每组数据包括一个整数 n ( 1 ≤ n ≤ 1000000 ) n(1 \le n \le 1000000) n(1≤n≤1000000)
1.4. Output
输出第 n n n 个“单身数”。
1.5. Sample Input
1
1
1.6. Sample Output
71
1.8. Source
2. 解读
先枚举第 1 e 6 1e6 1e6 个单身数,发现其为 99999971 99999971 99999971,也就是一共需要大概 1 e 8 1e8 1e8 次的运算,可以进行暴力求解。
但是直接暴力会发现通过不了,因为 long long
的最大值为
9223372036854775807
9223372036854775807
9223372036854775807, 也就是
9.223372
×
1
0
18
9.223372 \times 10 ^ {18}
9.223372×1018,然而
9999997
1
3
=
999999130000252299975611
99999971 ^3 = 999999130000252299975611
999999713=999999130000252299975611,也就是
9.999991
×
1
0
23
9.999991 \times 10 ^ {23}
9.999991×1023,超出了 long long
的取值范围。
所以我们在计算三次方时要对结果取模,防止溢出。因为我们考虑的是后两位,对 100 100 100 取模即可。
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;
}
}
联系邮箱:curren_wong@163.com
CSDN:https://me.csdn.net/qq_41729780
知乎:https://zhuanlan.zhihu.com/c_1225417532351741952
公众号:复杂网络与机器学习
欢迎关注/转载,有问题欢迎通过邮箱交流。