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

浙公网安备 33010602011771号