这个题对我来说, 难点在于关于余数的计算。 不会直接求出x[2], 所以跑了个循环暴力解决。
对于涉及余数计算的题, 要多注意计算过程可能出现负数和对零取余, 避免这样的试错带来的时间浪费。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#define ll long long
using namespace std;
const ll MOD=10001;
int n;
ll x[222];
bool judge(ll a)
{
if(n==0)
return 1;
if(n==1)
{
x[2]=0;
return 1;
}
ll k;
for(k=0; k<=10000; k++)
{
if((k*MOD+a*x[1]+x[3])%(a+1)==0)
{
x[2]=(k*MOD+a*x[1]+x[3])/(a+1)%MOD;
int b=(x[3]+MOD*MOD-a*x[2])%MOD;
x[4]=(a*x[3]+b)%MOD;
for(int i=5; i<2*n; i+=2)
{
if(x[i]!=(a*x[i-1]+b)%MOD)
return false;
x[i+1]=(a*x[i]+b)%MOD;
}
return true;
}
}
return false;
}
int main()
{
while(cin>>n)
{
for(int i=1; i<=2*n; i+=2)
cin>>x[i];
for(int i=0; i<=10000; i++)
if(judge(i))
break;
for(int i=2; i<=2*n; i+=2)
cout<<x[i]<<endl;
}
return 0;
}