1 条题解
-
0
自动搬运
来自洛谷,原作者为

Siyuan
Dream OIer.搬运于
2025-08-24 21:47:45,当前版本为作者最后更新于2018-11-17 15:49:05,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
写在前面
貌似没有题解证明了如下公式:$$d(ij)=\sum\limits_{x\mid i}\sum\limits_{y\mid j} [\gcd(x,y)=1]$$ 于是在此篇题解的
Extended部分我会给出一种证明!
求解(多组数据)
数据范围:
Solution
首先给出一个公式:
$$d(ij)=\sum\limits_{x\mid i}\sum\limits_{y\mid j} [\gcd(x,y)=1] $$因此所求为
$$\sum\limits_{i=1}^n\sum\limits_{j=1}^m\sum\limits_{x\mid i}\sum\limits_{y\mid j} [\gcd(x,y)=1] $$改变求和顺序,先枚举因数 和
$$\sum\limits_{x=1}^n\sum\limits_{y=1}^m \left\lfloor\frac{n}{x}\right\rfloor \left\lfloor\frac{m}{y}\right\rfloor [\gcd(x,y)=1] $$将 换成 吧 QAQ
$$\sum\limits_{i=1}^n\sum\limits_{j=1}^m \left\lfloor\frac{n}{i}\right\rfloor \left\lfloor\frac{m}{j}\right\rfloor[\gcd(i,j)=1] $$开始莫比乌斯反演!设
$$f(x)=\sum\limits_{i=1}^n\sum\limits_{j=1}^m \left\lfloor\frac{n}{i}\right\rfloor \left\lfloor\frac{m}{j}\right\rfloor[\gcd(i,j)=x] $$则有
$$g(x)=\sum\limits_{i=1}^n\sum\limits_{j=1}^m \left\lfloor\frac{n}{i}\right\rfloor \left\lfloor\frac{m}{j}\right\rfloor[x\mid\gcd(i,j)] $$我们把 提出就可以消除 的影响
$$g(x)=\sum\limits_{i=1}^{\frac{n}{x}}\sum\limits_{j=1}^{\frac{m}{x}} \left\lfloor\frac{n}{ix}\right\rfloor \left\lfloor\frac{m}{jx}\right\rfloor $$再根据 的定义,得到答案为
又因为
故
$$f(1)=\sum\limits_{1\mid d}\mu(\frac{d}{1})g(d)=\sum_{i=1}^n \mu(i)g(i) $$接下来再考虑如何求 ,我们可以先计算 $s(x)=\sum\limits_{i=1}^{x} \left\lfloor\frac{x}{i}\right\rfloor$,就可以 计算 。
时间复杂度:
Code
#include <cstdio> #include <algorithm> const int N=5e4+5; int tot,mu[N],p[N]; long long s[N]; bool flg[N]; void init() { mu[1]=1; for(int i=2;i<=5e4;++i) { if(!flg[i]) p[++tot]=i,mu[i]=-1; for(int j=1;j<=tot&&i*p[j]<=5e4;++j) { flg[i*p[j]]=1; if(i%p[j]==0) { mu[i*p[j]]=0; break; } else { mu[i*p[j]]=-mu[i]; } } } for(int i=1;i<=5e4;++i) mu[i]+=mu[i-1]; for(int x=1;x<=5e4;++x) { long long res=0; for(int i=1,j;i<=x;i=j+1) j=x/(x/i),res+=1LL*(j-i+1)*(x/i); s[x]=res; } } int main() { init(); int T; for(scanf("%d",&T);T--;) { int n,m; scanf("%d%d",&n,&m); if(n>m) n^=m^=n^=m; long long ans=0; for(int i=1,j;i<=n;i=j+1) { j=std::min(n/(n/i),m/(m/i)); ans+=1LL*(mu[j]-mu[i-1])*s[n/i]*s[m/i]; } printf("%lld\n",ans); } return 0; }
Extended
如何证明
$$d(ij)=\sum\limits_{x\mid i}\sum\limits_{y\mid j} [\gcd(x,y)=1] $$Solution中的公式?我们考虑把每个因子一一映射。
如果 的因子 中有一个因子 , 中有因子 , 中有因子 。我们规定:
- 如果 ,那么在 中选择。
- 如果 ,那么我们把 减去 ,在 中选择 (在 中选择 表示的是 )
对于 的因子 的其他因子同理。于是对于任何一个 有一个唯一的映射,且每一个选择对应着唯一的 。
通过如上过程,我们发现:对于 的因子 ,我们不可能同时在 和 中选择 (优先在 中选择,如果不够就只在 中选择不够的指数),故 和 必须互质。
等式得证。
- 1
信息
- ID
- 2400
- 时间
- 1000~2000ms
- 内存
- 125MiB
- 难度
- 6
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者