问题描述
给定一个正整数k(3≤k≤15),把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列,例如,当k=3时,这个序列是:
1,3,4,9,10,12,13,…
(该序列实际上就是:30,31,30+31,32,30+32,31+32,30+31+32,…)
请你求出这个序列的第N项的值(用10进制数表示)。
例如,对于k=3,N=100,正确答案应该是981。
1,3,4,9,10,12,13,…
(该序列实际上就是:30,31,30+31,32,30+32,31+32,30+31+32,…)
请你求出这个序列的第N项的值(用10进制数表示)。
例如,对于k=3,N=100,正确答案应该是981。
输入格式
只有1行,为2个正整数,用一个空格隔开:
k N
(k、N的含义与上述的问题描述一致,且3≤k≤15,10≤N≤1000)。
k N
(k、N的含义与上述的问题描述一致,且3≤k≤15,10≤N≤1000)。
输出格式
计算结果,是一个正整数(在所有的测试数据中,结果均不超过2.1*109)。(整数前不要有空格和其他符号)。
样例输入
3 100
样例输出
981
参考自https://blog.csdn.net/qq_42837885/article/details/83719463
先看上面这篇题解,然后再往下看。
看题目的意思,在所有的测试数据中,结果均不超过2.1*10^9,开int足够了。
然而我想着既然马上就要溢出了,那不如开一个long long放心了。
但是在蓝桥杯官网的练习系统提交测评时,这是一道开了long long 防溢出反而会错误的题目。
这是开了long long得90分的代码(满分100)
1 #include <bits/stdc++.h> 2 using namespace std; 3 int a[20]; 4 int main() { 5 int k, n; 6 cin >> k >> n; 7 int len = 0; 8 while (n) { 9 a[len++] = n % 2; 10 n /= 2; 11 } 12 long long ans = 0; //看这里 13 long long t = 1; //看这里 14 for (int i = 0; i < len; i++) { 15 ans += a[i] * t; 16 t *= k; 17 } 18 cout << ans << endl; 19 return 0; 20 }
这是第10个样例的输入和输出
在这个测试样例中,十进制的600,转换为二进制为1001011000,然后我们把1001011000当作一个13进制的数,然后输出这个数的10进制就是答案。
这是我开了long long 输出中间变量进行调试的的代码
1 #include <bits/stdc++.h> 2 using namespace std; 3 int a[20]; 4 int main() { 5 int k, n; 6 cin >> k >> n; 7 int len = 0; 8 while (n) { 9 a[len++] = n % 2; 10 n /= 2; 11 } 12 for (int i = len - 1; i >= 0; i--) { 13 cout << a[i]; 14 } 15 cout << endl; 16 long long ans = 0; 17 long long t = 1; 18 for (int i = 0; i < len; i++) { 19 ans += a[i] * t; 20 cout << ans << " "; 21 t *= k; 22 cout << t << endl; 23 } 24 cout << ans << endl; 25 return 0; 26 }
输出结果:
然后这是按照题意只开int进行调试的代码
1 #include <bits/stdc++.h> 2 using namespace std; 3 int a[20]; 4 int main() { 5 int k, n; 6 cin >> k >> n; 7 int len = 0; 8 while (n) { 9 a[len++] = n % 2; 10 n /= 2; 11 } 12 for (int i = len - 1; i >= 0; i--) { 13 cout << a[i]; 14 } 15 cout << endl; 16 int ans = 0; 17 int t = 1; 18 for (int i = 0; i < len; i++) { 19 ans += a[i] * t; 20 cout << ans << " "; 21 t *= k; 22 cout << t << endl; 23 } 24 cout << ans << endl; 25 return 0; 26 }
输出结果:
然后明白了,这道题本来的答案用int是存不下的,开int一定会溢出的。题目就是让你只开int输出溢出后的结果。
研究一下还是挺有意思的。
AC代码
1 #include <bits/stdc++.h> 2 using namespace std; 3 int a[20]; 4 int main() { 5 int k, n; 6 cin >> k >> n; 7 int len = 0; 8 while (n) { 9 a[len++] = n % 2; 10 n /= 2; 11 } 12 int ans = 0; 13 int t = 1; 14 for (int i = 0; i < len; i++) { 15 ans += a[i] * t; 16 t *= k; 17 } 18 cout << ans << endl; 19 return 0; 20 }