此题在ZOJ上AC,UVa上一直TLE,不知为何。
其中res这个变量要用longlong,用int会WA,虽然我感觉int足够。
这个题主要是用到了一个进制转化的问题。就像十进制里面每位相差10倍关系,二进制则是两倍关系。懂了这点就好做了。取余的时候二进制可以转化成十进制来算。最后枚举答案看是否能整除就行了。
一开始以为CRC是两块,30000*30000妥超时,后来才发现它是一个数。
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define MAXN 1024
#define INF 2139062143
#define ll long long
using namespace std;
const int key=34943;
char str[MAXN+5];
int main()
{
while(gets(str))
{
if(!strcmp(str,"#")) break;
ll res=0;
int L=strlen(str);
for(int i=0; i<L; ++i)
{
res=res*256+str[i];
res=res%key;
}
res=res*65536;
int ans=0;
for(int i=0; i<key; ++i)
if((res+i)%key==0)
{
ans=i;
break;
}
sprintf(str,"%04X",ans);
putchar(str[0]);
putchar(str[1]);
putchar(' ');
putchar(str[2]);
putchar(str[3]);
putchar('\n');
}
return 0;
}
后来发现暴力那块是没必要写的,改掉之后特判了空行,UVa上AC。
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define MAXN 1024
#define INF 2139062143
#define ll long long
using namespace std;
const int key=34943;
char str[MAXN+5];
int main()
{
while(gets(str))
{
if(!strcmp(str,"#")) break;
if(!strlen(str))
{
puts("00 00");
continue;
}
ll res=0;
int L=strlen(str);
for(int i=0; i<L; ++i)
{
res=res*256+str[i];
res=res%key;
}
res=res*65536;
res=res%key;
int ans=key-res;
sprintf(str,"%04X",ans);
putchar(str[0]);
putchar(str[1]);
putchar(' ');
putchar(str[2]);
putchar(str[3]);
putchar('\n');
}
return 0;
}