您的位置:首页 > 其它

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

2015-01-24 17:15 330 查看


题意

题意看了半小时才懂。

有两个复数,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慢了一倍


代码

LL Xi, Xr, Bi, Br, limit;

int cnt, ans[MAXN];

bool flag;


void DFS(LL r, LL ii, int pos)

{

if (pos > 100 || flag) return;

if (ii == 0 && r == 0)

{

cnt = pos;

flag = true;

return;

}

for (int i = 0; i*i < limit; i++)

{

ans[pos] = i;

LL a = (r-i) * Br + ii*Bi, b = ii*Br - (r-i) * Bi;

if (a % limit == 0 && b % limit == 0)

{

DFS(a / limit, b / limit, pos + 1);

if (flag) return;

}

}

}


int main()

{

//ROP;

ios::sync_with_stdio(0);


int T, i, j;

cin >> T;

while (T--)

{

flag = false;

cin >> Xr >> Xi >> Br >> Bi;

limit = Br*Br + Bi*Bi;

DFS(Xr, Xi, 0);

if (!flag) cout << "The code cannot be decrypted.";

else

{

cout << ans[cnt-1];

for (int i = cnt-2; i >= 0; i--) cout << "," << ans[i];

}

cout << endl;

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ACM