题目
莫反好题
题意
f(x) 表示满足 (a,b,c)∈Z3,c≤x,a<b,gcd(a,b)=1,a2+b2=c2 的 (a,b,c) 组数,求 f(l)...f(r)。T≤100,l≤r≤109,r−l≤105。
做法
设 D=max(r−l)=105。
第一步赛时就没有想到。
(a,b,c) 都能用 (m2−n2,2mn,m2+n2) 表示,此时只用满足 m>n,gcd(m,n)=1,(m%2)=(n%2)。
先想如何计算 f(N)。
因为要满足 gcd(m,n)=1,套路地使用莫反。
[gcd(m,n)=1]=d∣m,d∣n∑μ(d)
f(N)=[gcd(m,n)=1][m2+n2≤N][(m%2)=(n%2)]=d∣m,d∣n∑μ(d)[m2+n2≤N][(m%2)=(n%2)]
设 m=dx,n=dy,即要求 x2+y2≤d2N。
先枚举 d∈[1,N],再枚举 x∈[1,dN],总复杂度为 O(N+2N+3N+...)=O(NlnN)。
直接做就是 O(TDrlnr),拼上暴力获得 80pts。
不难发现每次单独求 f(N) 过于麻烦,可以先求出 f(l),再对于 i∈[l+1,r] 每次加上满足 m2+n2=i 的情况。
实际上直接暴力枚举 m∈[1,r] 后,再枚举 l−m2≤n2≤r−m2,即 l−m2≤n≤r−m2。
估一下复杂度
∵(r−m2−l−m2)(r−m2+l−m2)=r−m2−l+m2=r−l≤D∴当r−m2−l−m2=r−m2+l−m2时,即l=m2,r=D−m2,max(r−m2−l−m2)=D−2m2≤D
所以单次复杂度会比 O(D) 更小,计算 [l+1,r] 的部分复杂度为 O(rD)。
综上,本题复杂度为 O(Trlnr+TrDlogr)。
前一半是 3×107 左右,后面是 1010 左右,由于计算时是往大的算了,而且 gcd
的常数非常小,所以实际远没有这么大,如果真的被卡常了,可以通过预处理 m 的质因子,少一个求 gcd 的 logr。
感觉难点主要在对后半部分暴力可过的观察和复杂度计算。
贴一手代码。