UVa 12169 - Disgruntled Judge ( 暴力枚举 )
题意
(题干摘自紫书)
有个裁判出的题太难,总是没人做,所以他很不爽。有一次他终于忍不住了,心想:“反正我的题没人做,我干嘛要费那么多心思出题?不如就输入一个随机数,输出一个随机数吧。”于是他找了3个整数x1、a和b,然后按照递推公式xi=(axi-1+b) mod 10001计算出了一个长度为2T的数列,其中T是测试数据的组数。然后,他把T和x1, x3,…, x2T-1写到输入文件中,x2,x4,…, x2T写到了输出文件中。你的任务就是解决这个疯狂的题目:输入T, x1, x3,…, x2T-1,输出x2, x4,…, x2T。输入保证T≤100,且输入的所有x值为0~10000的整数。如果有多种可能的输出,任意输出一个即可。
思路
看这题正解应该是exgcd
但暴力枚举ab也能水过去
跑出来330ms
AC代码
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int x[250], xx[250];
int main()
{
int T, a, b, i;
scanf("%d",&T);
bool ok = false;
for( i = 1; i < 2*T; i += 2 )
scanf("%d",&xx[i]);
for( a = 0; a <= 10000; a++ ){
for( b = 0; b <= 10000; b++ ){
x[1] = xx[1];
x[2] = (a*xx[1]+b) % 10001;
for( i = 3; i <= 2*T; i++ ){
int m = (a*x[i-1]+b) % 10001;
if( xx[i] != 0 && xx[i] != m ) break;
x[i] = m;
if( i == 2*T ) {
ok = true;
break;
}
}
if( ok ) break;
}
if( ok ) break;
}
for( i = 2; i <= 2*T; i += 2 )
printf("%d\n",x[i]);
return 0;
}