P8443 gcd. 题解

题意:求 $\gcd\limits_{i=l}^r\lfloor\dfrac ix\rfloor$,$1\le x\le l\le r\le 10^{18}$。

Subtask 1

特殊条件:$x=1$,问题转化为求 $\gcd\limits_{i=l}^ri$。

  • $l=r$,$\gcd\limits_{i=l}^ri=l=r$,显然。(然而并没有 $x=1\bigwedge l=r$ 的数据)

  • $l\neq r$,因为 $\gcd(n,n+1)=1$,所以 $\gcd\limits_{i=l}^ri=1$。

Subtask 2

特殊条件:$l=r$。$\gcd\limits_{i=l}^r\lfloor\dfrac ix\rfloor=\lfloor\dfrac lx\rfloor=\lfloor\dfrac rx\rfloor$,显然。

Subtask 3

特殊条件:$r-l≤10^5$。$O(r-l)$ 暴力模拟即可。

Subtask 4

因为 $\gcd(n,n)=n$,所以可以把 $\{\lfloor\dfrac ix\rfloor|l\leq i\leq r\}$ 去重后再扔进 $\gcd$ 里算。

容易发现 $\{\lfloor\dfrac ix\rfloor|l\leq i\leq r\}$ 去重后是一个连续正整数段,问题转化为求 $\gcd\limits_{i=\lfloor\frac lx\rfloor}^{\lfloor\frac rx\rfloor}i$。

然后就变成 Subtask 1 了。

Code

#include <cstdio>
int T;long long l, r, x;
int main()
{
    scanf("%d", &T);while(T--)
    {
        scanf("%lld%lld%lld", &l, &r, &x);l /= x;r /= x;
        if(l == r) printf("%lld\n", l);else puts("1");
    }
    return 0;
}
posted @ 2022-07-26 15:25  Jijidawang  阅读(17)  评论(0)    收藏  举报  来源