Description
给出一个整数
N
, 求有多少对
Input
T(T≤10000) 组数据。每组数据 N≤3×107 。
Output
每组数据输出 Case X: answer
于一行。
Solve
设
C=gcd(A,B)
,枚举
C
,再枚举
首先可以想到的是 A⊕C=A⊕A⊕B=B 。那么我们可以先计算出 B˙=A⊕C ,再看是否有 1≤B˙≤A 并且 gcd(A,B˙)=C 。
这样复杂度应该是
O(nlog(n)loglog(n))
。但是还是嫌慢。
把满足条件的
A,B,C
输出之后,发现规律
C=A−B
,证明略。
由此我们可以枚举
A,C
之后,计算出
B˙=A−C
,如果
A⊕B˙=C
的话说明这就是一组解。
现在的复杂度是 O(nlog(n)) 。但是这样只能解决一组查询,题目的查询数目太多,这又应该怎么办呢?
我们用 cnt[n]
表示输入
n
<script id="MathJax-Element-48" type="math/tex">n</script>,时应有的结果。一开始 cnt[]
全是0,不妨每找到一组解就让 cnt[a]++
。最后再执行 cnt[i] += cnt[i - 1]
就可以了。
此题时限 5s,通过用了 868ms。可以接受。
https://code.csdn.net/snippets/1583438/master/uva12716.cpp/raw