UVA12716 GCD XOR

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值