UVa 12169 Disgruntled Judge 紫书
思路还是按照紫书,枚举a,得出b, 然后验证。
代码参考了LRJ的。
1 #include <cstdio> 2 #include <iostream> 3 using namespace std; 4 5 const int maxn=100*2+5; 6 const int M=10001; 7 int x[maxn], T; 8 9 void solve() 10 { 11 for(int a=0; a<M; a++) 12 for(int b=0; b<M; b++) 13 { 14 bool ok=true; 15 for(int i=2; i<=2*T; i+=2) 16 { 17 x[i] = (a*x[i-1]+b) %M; 18 if(i+1<=2*T && x[i+1] != (a*x[i]+b) %M)//验证 19 { 20 ok=false; 21 break; 22 } 23 } 24 if(ok) return; 25 } 26 } 27 28 29 30 int main() 31 { 32 while(cin>>T) 33 { 34 for(int i=1; i<=2*T-1; i+=2) cin>>x[i]; 35 solve(); 36 for(int i=2; i<=2*T; i+=2) cout<<x[i]<<endl; 37 } 38 }
简洁明了, 没什么可说的, 注意循环的边界条件, 还有a+=2不要写成a++。
另一种扩展欧几里得的解法, 我下次再补吧。

浙公网安备 33010602011771号