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;
}
相关文章推荐
- 【dfs】hdu 1111 Secret Code
- HDU 1111 Secret Code (DFS)
- hdu 4431 Mahjong (模拟,枚举+dfs)
- hdu 1111 Secret Code dfs
- HDU 4801 Pocket Cube(暴力模拟 dfs)
- HDU 5355 Cake(数学 DFS)
- hdu 4531(模拟+BFS+DFS)
- 秦九韶算法—— HDU 1111 Secret Code
- HDU 4814 Golden Radio Base 数学 模拟 或者乱搞。。。。
- hdu 4771 求一点遍历所有给定点的最短路(bfs+dfs)
- hdu 4272 LianLianKan(模拟dfs+map)
- hdu 4431 Mahjong(dfs+模拟)
- HDOJ1111 Secret Code(数论+DFS)
- HDU 2895 Edit distance(数学+模拟)
- HDU 2932 Extraordinarily Tired Students(数学 & 模拟)
- hdu 1111 Secret Code
- HDU 4611 (2013多校联赛1001 数学+模拟)
- HDU 1111 Secret Code DFS 解题报告
- hdu 1298 字典树 + DFS (模拟T9文本输入)
- HDU 1988 & ZOJ 2991 Flipping Burned Pancakes(数学啊+模拟)