UVA12716 GCD XOR

来源:互联网 发布:字符串压缩算法 编辑:程序博客网 时间:2024/06/04 17:43

Description

给出一个整数 N, 求有多少对 (A,B) 满足:gcd(A,B)=AB 并且 1BAN

Input

T(T10000) 组数据。每组数据 N3×107

Output

每组数据输出 Case X: answer 于一行。

Solve

C=gcd(A,B),枚举 C,再枚举 A,这样枚举 O(nlog(n)) 次。每次要判断存不存在 B,使得 AB=C

首先可以想到的是 AC=AAB=B。那么我们可以先计算出 B˙=AC,再看是否有 1B˙A 并且 gcd(A,B˙)=C

这样复杂度应该是 O(nlog(n)loglog(n))。但是还是嫌慢。
把满足条件的 A,B,C 输出之后,发现规律 C=AB,证明略。
由此我们可以枚举 A,C 之后,计算出 B˙=AC,如果 AB˙=C 的话说明这就是一组解。

现在的复杂度是 O(nlog(n))。但是这样只能解决一组查询,题目的查询数目太多,这又应该怎么办呢?

我们用 cnt[n] 表示输入 n,时应有的结果。一开始 cnt[] 全是0,不妨每找到一组解就让 cnt[a]++。最后再执行 cnt[i] += cnt[i - 1] 就可以了。

此题时限 5s,通过用了 868ms。可以接受。

https://code.csdn.net/snippets/1583438/master/uva12716.cpp/raw

0 0
原创粉丝点击