UVa 12169

题意

(题干摘自紫书)

有个裁判出的题太难,总是没人做,所以他很不爽。有一次他终于忍不住了,心想:“反正我的题没人做,我干嘛要费那么多心思出题?不如就输入一个随机数,输出一个随机数吧。”于是他找了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
",x[i]);
    return 0;
}
原文地址:https://www.cnblogs.com/JinxiSui/p/9740613.html