骚年,汝可知”AK”之力乎。
所谓AK就是all kill的意思,也就是在比赛结束前就将所有题目全都解出,而在茫茫人海的ACM赛场上总有队伍寻找着AK的的方法,但这往往都是不可能的。而二十二进制,是第二个恰好能表达AK的进制。这个进制将带领你走向AK。
在走向AK的道路上,它给出了一个二十二进制的数字a,希望你能找到一个大于等于a的最小的二十二进制数b,它能且能被7整除,因为7是个幸运数字,它将带给你好运。
只有寻找到二十二进制数b,你才可以见识到真正的AK,加油吧,骚年!
注意,在二十二进制下:
A可以转化为十进制10
B可以转化为十进制11
……
K可以转化为十进制20
L可以转化成十进制21
所谓AK就是all kill的意思,也就是在比赛结束前就将所有题目全都解出,而在茫茫人海的ACM赛场上总有队伍寻找着AK的的方法,但这往往都是不可能的。而二十二进制,是第二个恰好能表达AK的进制。这个进制将带领你走向AK。
在走向AK的道路上,它给出了一个二十二进制的数字a,希望你能找到一个大于等于a的最小的二十二进制数b,它能且能被7整除,因为7是个幸运数字,它将带给你好运。
只有寻找到二十二进制数b,你才可以见识到真正的AK,加油吧,骚年!
注意,在二十二进制下:
A可以转化为十进制10
B可以转化为十进制11
……
K可以转化为十进制20
L可以转化成十进制21
输入要求
每次先输入一个整数T(1 <= T <= 100),接下来T组测试数据
接下来每组数据输入一个二十二进制数a (0 <= a <= 22^100000)
保证这个二十二进制数只有大写字母[A-L]和数字[0-9]
输出要求
每对于每组数据第一行输出格式为"Case #i:",表示第i组测试数据
第二行输出为题目要求找到的这个二十二进制数(所有字母用大写表示)
测试数据
输入示例
2
AC
AK
输出示例
Case #1:
AI
Case #2:
B3
小贴士
对于第一组样例,AC的十进制为232,下一个能被7整除的十进制数为238,它所表示的二十二进制数为AI
题解:n进制转换成10进制后 模一个数 如果 为 1,n进制能否整除这个数 等于 这个n进制每个位上的数都转换为10进制的后数相加的结果除这个数。
之后就是大数加法
。 出题学长:小学数学时学过 21能被3整除 可以 等价于 2+1=3 能否被3整除, 然而我们队现场真的没有想到。ps:别用map,会tle,我再也不敢蛇皮操作了 orz
AC代码:
#include <iostream> #include <map> #include <string> #include <cstdio> using namespace std; char nm[] = "0123456789ABCDEFGHIJKL"; int change(char c) { if (c >= '0' && c <= '9') { return c - '0'; } return c - 'A' + 10; } int yuu(string a) { // ÇóÓà int sum = 0; for (int i = 0; a[i] != '\0'; i++) { sum += change(a[i]); } return sum % 7; } void _plus(string a, int yu) { int t[a.size()]; for (int i = a.size()-1; i >= 0; i--) { t[i] = change(a[i]); } t[a.size()-1] += yu; for (int i = a.size()-1; i >= 0; i--) { if (t[i] >= 22) { a[i] = nm[t[i] % 22]; if (i != 0) t[i-1]++; else a = "1" + a; } else { a[i] = nm[t[i]]; } } } int main() { int t; string a; cin >> t; int cas = 0; while (t--) { cas++; cin >> a; int yu = yuu(a); string ans; if (yu == 0) { ans = a; } else ans = _plus(a, 7-yu); printf("Case #%d:\n", cas); cout << ans << endl; } }