【发布时间】:2012-09-03 16:37:54
【问题描述】:
(来源于最近完成的一次编程竞赛)
在 1..10^7 范围内给你两个 10^5 整数数组:
int N[100000] = { ... }
int D[100000] = { ... }
想象有理数 X 是 N 的所有元素相乘并除以 D 的所有元素的结果。
修改两个数组而不改变 X 的值(并且不分配任何超出范围的元素),使得 N 的乘积和 D 的乘积没有公因数。
一个天真的解决方案(我认为)会起作用......
for (int i = 0; i < 100000; i++)
for (int j = 0; j < 100000; j++)
{
int k = gcd(N[i], D[j]); // euclids algorithm
N[i] /= k;
D[j] /= k;
}
...但这太慢了。
什么是少于大约 10^9 次操作的解决方案?
【问题讨论】:
-
不知道您为什么发布带有答案链接的问题。
-
@RaymondChen:我发问题的时候没有解法代码,拿到解法代码的时候也看不懂,所以单独发一个问题解释一下,把它们联系起来。
-
它出现在哪个比赛中?
-
不记得了,CodeForces 还是 CodeChef。
标签: c algorithm math factorization