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

题意

题意看了半小时才懂。

有两个复数,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$。

然后递归下去计算即可。

代码

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;
}

Powered by Jekyll and Theme by solid