P1026 · OFFICIAL SOLUTION

P1026 藿香正气液 官方题解

Gioush OJ · P1026 藿香正气液

藿香正气液

【题意简述】

求满足 1x<yn1\le x<y\le ngcd(x,y)=yx\gcd(x,y)=y-x 的整数对数量。

【Hint】

d=yxd=y-x。条件变为 gcd(x,x+d)=d\gcd(x,x+d)=d,也就是 dxd\mid x

【提示】

由于 gcd(x,x+d)=gcd(x,d)\gcd(x,x+d)=\gcd(x,d),要让它等于 dd,等价于 dxd\mid x

【解法】

x=adx=ad,则 y=(a+1)dy=(a+1)d。只需要满足 (a+1)dn(a+1)d\le n,即

and1.a\le \left\lfloor\dfrac{n}{d}\right\rfloor-1.

于是固定 dd 的贡献为 nd1\left\lfloor\dfrac{n}{d}\right\rfloor-1,并且 dn2d\le \left\lfloor\dfrac{n}{2}\right\rfloor。答案为

d=1n/2(nd1).\sum_{d=1}^{\lfloor n/2\rfloor}\left(\left\lfloor\dfrac{n}{d}\right\rfloor-1\right).

使用整除分块计算即可。

【推导】

数据点较小时可以直接枚举 (x,y)(x,y) 并判断条件。令 d=yxd=y-x 后,

gcd(x,y)=gcd(x,x+d)=gcd(x,d).\gcd(x,y)=\gcd(x,x+d)=\gcd(x,d).

所以条件等价于 dxd\mid x。写作 x=tdx=td 后,y=(t+1)dy=(t+1)d,每个满足 (t+1)dn(t+1)d\le n 的正整数对 (t,d)(t,d) 都对应唯一合法数对,反之亦然;求和没有重复也没有遗漏。

【复杂度】

q=n/dq=\left\lfloor n/d\right\rfloor,同一个 qq 对应的 dd 是一段连续区间,因此可以整除分块。时间复杂度为 O(n)\mathcal{O}(\sqrt n),空间复杂度为 O(1)\mathcal{O}(1);计数与乘法使用 long long

【参考代码】

/*Author:EhundateghDate:2026/7/21Name:elixir.cppYou steal,I kill.*/#include <cstdio>#include <algorithm>using namespace std;long long n,Ans;int main(){    freopen("elixir.in","r",stdin);    freopen("elixir.out","w",stdout);    scanf("%lld",&n);    long long Limit=n/2;    for(long long Left=1,Right;Left<=Limit;Left=Right+1){        long long Value=n/Left;        Right=min(Limit,n/Value);        Ans+=(Value-1)*(Right-Left+1);    }    printf("%lld\n",Ans);    return 0;}