YY的GCD【莫比烏斯反演】
阿新 • • 發佈:2018-07-14
for amp spl .org init www. ref min r+
令\(T=xp\)則
\[\begin{aligned}ans&=\sum_{T=1}^n\sum_{p\in prime \;\&\&\; p|T}{\mu(\frac{T}{p})\lfloor\frac{n}{T}\rfloor\lfloor\frac{m}{T}\rfloor}\&=\sum_{T=1}^n\lfloor\frac{n}{T}\rfloor\lfloor\frac{m}{T}\rfloor\sum_{p\in prime \;\&\&\; p|T}\mu(\frac{T}{q}) \end{aligned} \]
只要篩出\(G(T)=\sum_{p\in prime \;\&\&\; p|T}\mu(\frac{T}{q})\) 就可以\(O(\sqrt{N})\)算出
\[ans=\sum_{T=1}^n\lfloor\frac{n}{T}\rfloor\lfloor\frac{m}{T}\rfloor G(T)\]
這題除了\(ans\)都不能開\(long\;long\),不然會\(TLE\)
[Luogu2257]YY的GCD
求\(\sum_{i=1}^n\sum_{j=1}^m[(x, y)\)為質數\(]\)
\(T \le {10}^4, 1\le n, m \le {10}^7\)
假設\(p\)為\(M\)以內的質數
\[\begin{aligned}ans&=\sum_{p\in prime}\sum_{i=1}^n\sum_{j=1}^m[(i, j) == p]\&=\sum_{p\in prime}\sum_{x=1}^{\lfloor\frac{n}{p}\rfloor}\mu(x)\lfloor\frac{n}{xp}\rfloor\lfloor\frac{m}{xp}\rfloor\end{aligned}\]
令\(T=xp\)則
\[\begin{aligned}ans&=\sum_{T=1}^n\sum_{p\in prime \;\&\&\; p|T}{\mu(\frac{T}{p})\lfloor\frac{n}{T}\rfloor\lfloor\frac{m}{T}\rfloor}\&=\sum_{T=1}^n\lfloor\frac{n}{T}\rfloor\lfloor\frac{m}{T}\rfloor\sum_{p\in prime \;\&\&\; p|T}\mu(\frac{T}{q}) \end{aligned} \]
只要篩出\(G(T)=\sum_{p\in prime \;\&\&\; p|T}\mu(\frac{T}{q})\)
\[ans=\sum_{T=1}^n\lfloor\frac{n}{T}\rfloor\lfloor\frac{m}{T}\rfloor G(T)\]
這題除了\(ans\)都不能開\(long\;long\),不然會\(TLE\)
void init(){ miu[1]=1; for(int i=2; i < Maxn; i++){ if(!p[i]) p[++ptot]=i, miu[i]=-1; for(int j=1, x; j <= ptot && (x=p[j]*i) < Maxn; j++){ p[x]=1; if(i%p[j] == 0) break; miu[x]=-miu[i]; } } for(int i=1; i <= ptot; i++) for(int j=p[i]; j < Maxn; j+=p[i]) G[j]+=miu[j/p[i]]; for(int i=1; i < Maxn; i++) G[i]+=G[i-1]; } void solve(){ init(); int T=read(); while(T--){ n=read(), m=read(); ll ans=0; if(n > m) swap(n, m); for(int l=1, r=0; r < n; l=r+1){ r=min(n/(n/l), m/(m/l)); ans+=1ll*(G[r]-G[l-1])*(n/l)*(m/l); } printf("%lld\n", ans); } }
YY的GCD【莫比烏斯反演】