您的位置:首页 > 其它

uva 128

2014-11-25 21:22 337 查看
题意:给出一个字符串,把每一个字符对应ascii码的值,每个字符就是一个256进制的数,将这个字符串末尾再添加两个数要刚好整除n = 34943,要求输出这两个数的16进制形式。

题解:先利用 (a+b)mod n  =( ( a mod n ) + (b mod n) ) mod n  和 (a * b) mod n  =( ( a mod n ) * (b mod n) ) mod n 可以把字符串的值求出,然后再扩大256*256倍,因为最后添加两个数,相当于之前的值扩大256^2倍再加这两个未知数,根据(sum * 256 * 256 + x) mod n = 0,那么 x = n - (sum mod n)。

#include <stdio.h>
#include <string.h>
#include <math.h>
using namespace std;
const int N = 1500;
char s
;
const char flag[] = {"0123456789ABCDEF"};

int main() {
while (gets(s) && s[0] != '#') {
int len = strlen(s);
if (len == 0) {
printf("00 00\n");
continue;
}
long long sum = 0;
int n = 34943;
for (int i = 0; i < len; i++)
sum = (((sum % n) * 256) % n + s[i]) % n;
int res = n - (sum * 256 * 256) % n;
int ans[4];
for (int i = 0; i < 4; i++) {
ans[3 - i] = flag[res % 16];
res /= 16;
}
for (int i = 0; i < 4; i++) {
printf("%c", ans[i]);
if (i == 1)
printf(" ");
}
printf("\n");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  uva