HDU 1111 - Secret Code (DFS + 一点数学 + 模拟)

来源:互联网 发布:mac 窗口超出屏幕 编辑:程序博客网 时间:2024/06/10 17:18

题意

题意看了半小时才懂。

有两个复数,X和B。

$X = a_0 + a_1*B + a_2 * B^2 + ... + a_n * B^n$

现在要求出$a_0 ~ a_n$

思路

假设现在从头开始算。

复数除法:$\frac {a + b_i}{c + d_i} = \frac {ac + bd}{c^2 + d^2} + \frac {bc - ad}{c^2 + d^2}i$

那么枚举$a_0, X_r - a_0$之后两边同除B,显然这时候要实部和虚部都要分别整除$c^2 + d^2$

然后递归下去计算即可。

这题的数据好像有点多。一开始没关缓冲区同步TLE了。 
不过用cin比用scanf慢了一倍

代码

  1. LL Xi, Xr, Bi, Br, limit;
  2. int cnt, ans[MAXN];
  3. bool flag;
  4. void DFS(LL r, LL ii, int pos)
  5. {
  6. if (pos > 100 || flag) return;
  7. if (ii == 0 && r == 0)
  8. {
  9. cnt = pos;
  10. flag = true;
  11. return;
  12. }
  13. for (int i = 0; i*i < limit; i++)
  14. {
  15. ans[pos] = i;
  16. LL a = (r-i) * Br + ii*Bi, b = ii*Br - (r-i) * Bi;
  17. if (a % limit == 0 && b % limit == 0)
  18. {
  19. DFS(a / limit, b / limit, pos + 1);
  20. if (flag) return;
  21. }
  22. }
  23. }
  24. int main()
  25. {
  26. //ROP;
  27. ios::sync_with_stdio(0);
  28. int T, i, j;
  29. cin >> T;
  30. while (T--)
  31. {
  32. flag = false;
  33. cin >> Xr >> Xi >> Br >> Bi;
  34. limit = Br*Br + Bi*Bi;
  35. DFS(Xr, Xi, 0);
  36. if (!flag) cout << "The code cannot be decrypted.";
  37. else
  38. {
  39. cout << ans[cnt-1];
  40. for (int i = cnt-2; i >= 0; i--) cout << "," << ans[i];
  41. }
  42. cout << endl;
  43. }
  44. return 0;
  45. }
0 0