易得 $\sum\limits_{g=1}^{n} g \sum\limits_{k=1}^{n} \mu(k) \lfloor\frac{n}{gk}\rfloor \lfloor\frac{n}{gk}\rfloor $

记 \(T=gk\) 枚举 \(T\) ,注意这里既然满足 \(T=gk\) 要保证两个乘起来确实是 \(T\) ,选择把 \(k\) 换成 $\frac{T}{g} $ .

$\sum\limits_{T=1}^{n} \lfloor\frac{n}{T}\rfloor \lfloor\frac{n}{T}\rfloor \sum\limits_{g|T} g\mu(\frac{T}{g}) $

$\sum\limits_{T=1}^{n} \lfloor\frac{n}{T}\rfloor \lfloor\frac{n}{T}\rfloor \varphi(T) $

猜了一下每次回答都是根号,可能可以,但是交上去T了。原来这个时限是200ms,太惊人了,这道题卡掉了所有其他的思路。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll; const int MAXN=1000000;
int prime[MAXN+1];
int &ptop=prime[0];
ll Phi[MAXN+1]; inline void sieve(){
const int &n=MAXN;
Phi[1]=1;
for(int i=2;i<=n;i++){
if(!Phi[i]){
ptop++;
prime[ptop]=i;
Phi[i]=i-1;
}
for(int j=1;j<=ptop;j++){
int &p=prime[j];
if(i*p>n)
break;
if(i%p){
Phi[i*p]=Phi[i]*Phi[p];
}
else{
Phi[i*p]=Phi[i]*p;
break;
}
}
}
for(int i=1;i<=n;i++){
Phi[i]+=Phi[i-1];
}
} inline ll H(int n){
ll res=0;
for(int l=1,r;l<=n;l=r+1){
int t=n/l;
r=n/t;
res+=1ll*t*t*(Phi[r]-Phi[l-1]);
}
return res;
} inline ll G(int n){
ll res=(H(n)-1ll*n*(n+1)/2)/2;
return res;
} int main() {
#ifdef Yinku
freopen("Yinku.in","r",stdin);
#endif // Yinku
sieve();
int n;
while(~scanf("%d",&n)){
if(n==0)
break;
else{
printf("%lld\n",G(n));
}
}
}

问题在哪里?莫比乌斯反演不擅长进行多次回答,观察题目的数据可能想让我们用埃筛?

回到上面的式子。


其实因为是 \(n==m\) ,上面的反演很多余,枚举 \(g\) 的时候可以发现另一个公式,但是好像复杂度也是一样的,先留着,这个也是可以用杜教筛跑出大数据,应该比反演要快(因为这样大的Phi是比上面的少的)。

易得 $\sum\limits_{g=1}^{n} g \sum\limits_{i=1}^{\lfloor\frac{n}{g}\rfloor} 2\varphi(i) - 1 $

#include<bits/stdc++.h>
using namespace std;
typedef long long ll; const int MAXN=1000000;
int prime[MAXN+1];
int &ptop=prime[0];
ll Phi[MAXN+1]; inline void sieve(){
const int &n=MAXN;
Phi[1]=1;
for(int i=2;i<=n;i++){
if(!Phi[i]){
ptop++;
prime[ptop]=i;
Phi[i]=i-1;
}
for(int j=1;j<=ptop;j++){
int &p=prime[j];
if(i*p>n)
break;
if(i%p){
Phi[i*p]=Phi[i]*Phi[p];
}
else{
Phi[i*p]=Phi[i]*p;
break;
}
}
}
for(int i=1;i<=n;i++){
Phi[i]+=Phi[i-1];
}
} inline ll s1(ll l,ll r){
return (l+r)*(r-l+1)/2;
} inline ll H(int n){
ll res=0;
for(int l=1,r;l<=n;l=r+1){
int t=n/l;
r=n/t;
res+=(2ll*Phi[t]-1)*s1(l,r);
}
return res;
} inline ll G(int n){
ll res=(H(n)-1ll*n*(n+1)/2)/2;
return res;
} int main() {
#ifdef Yinku
freopen("Yinku.in","r",stdin);
#endif // Yinku
sieve();
int n;
while(~scanf("%d",&n)){
if(n==0)
break;
else{
printf("%lld\n",G(n));
}
}
}

一切从头开始,我们学习反演还有这些东西的初衷是想要降低单次回答的复杂度,看到原来的问题:

$ G(n) = \sum\limits_{i=1}{n-1}\sum\limits_{j=i+1}{n} gcd(i,j) \(
交换求和,这个没问题:
\) G(n) = \sum\limits_{j=2}{n}\sum\limits_{i=1}{j-1} gcd(i,j) $

记 $ H(n) = \sum\limits_{i=1}^{n-1} gcd(i,n) $

原式 \(G(n) = \sum\limits_{j=2}^{n} H(j)\)

貌似 \(H(n)\) 好像似曾相识? $ H(n) = ( \sum\limits_{i=1}^{n} gcd(i,n) ) - n$

里面这个不是前几天处理过?这种 \(gcd\) 就只可能是 \(n\) 的因子:

$ H(n) = ( \sum\limits_{d|n} d \sum\limits_{i=1}^{n} [gcd(i,n)d] ) - n$

$ H(n) = ( \sum\limits_{d|n} d \sum\limits_{i=1}^{\frac{n}{d}} [gcd(i,\frac{n}{d})1] ) - n$

$ H(n) = ( \sum\limits_{d|n} d \varphi(\frac{n}{d}) ) - n$

为方便,记 $ h(n) = \sum\limits_{d|n} d \varphi(\frac{n}{d}) $

意思是这个 \(h(n)\) 可以用埃筛,那么这个问题到这里就解决了,但是会不会有线筛的做法呢?

这个 \(id*\varphi\) 狄利克雷卷积在这里处理过。

那么来一波线性的做法:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll; const int MAXN=1000000;
int prime[MAXN+1];
int &ptop=prime[0];
ll h[MAXN+1];
int pk[MAXN+1]; inline void sieve(){
const int &n=MAXN;
for(int i=2;i<=n;i++){
if(!pk[i]){
ptop++;
prime[ptop]=i;
pk[i]=i;
h[i]=i+i-1;
}
for(int j=1;j<=ptop;j++){
int &p=prime[j];
int t=i*p;
if(t>n)
break;
if(i%p){
pk[t]=pk[p];
h[t]=h[i]*h[p];
}
else{
pk[t]=pk[i]*p;
if(pk[t]==t){
h[t]=(t-i)+h[i]*p;
}else{
h[t]=h[pk[t]]*h[t/pk[t]];
}
break;
}
}
}
for(int i=1;i<=n;i++){
h[i]-=i;
}
for(int i=1;i<=n;i++){
h[i]+=h[i-1];
}
} inline ll G(int n){
ll res=h[n]-h[1];
return res;
} int main() {
#ifdef Yinku
freopen("Yinku.in","r",stdin);
#endif // Yinku
sieve();
int n;
while(~scanf("%d",&n)){
if(n==0)
break;
else{
printf("%lld\n",G(n));
}
}
}

洛谷 - SP3871 GCDEX - GCD Extreme - 莫比乌斯反演的更多相关文章

  1. 洛谷 P5518 - [MtOI2019]幽灵乐团 / 莫比乌斯反演基础练习题(莫比乌斯反演+整除分块)

    洛谷题面传送门 一道究极恶心的毒瘤六合一题,式子推了我满满两面 A4 纸-- 首先我们可以将式子拆成: \[ans=\prod\limits_{i=1}^A\prod\limits_{j=1}^B\p ...

  2. [洛谷P1390]公约数的和·莫比乌斯反演

    公约数的和 传送门 分析 这道题很显然答案为 \[Ans=\sum_{i=1}^n\sum_{j=i+1}^n (i,j)\] //其中\((i,j)\)意味\(gcd(i,j)\) 这样做起来很烦, ...

  3. 洛谷 - P4449 - 于神之怒加强版 - 莫比乌斯反演

    https://www.luogu.org/problemnew/show/P4449 \(F(n)=\sum\limits_{i=1}^{n}\sum\limits_{i=1}^{m} gcd(i, ...

  4. 洛谷P2522 [HAOI2011]Problem b(莫比乌斯反演)

    题目描述 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数. 输入输出格式 输入格式: 第一行一个整数 ...

  5. 洛谷P3455 [POI2007]ZAP-Queries (莫比乌斯反演)

    题意:求$\sum_{i=1}^{a}\sum_{j=1}^{b}[gcd(i,j)==d]$(1<=a,b,d<=50000). 很套路的莫比乌斯反演. $\sum_{i=1}^{n}\ ...

  6. 洛谷P3768 简单的数学题 莫比乌斯反演+杜教筛

    题意简述 求出这个式子 \[ \sum_{i=1}^n\sum_{j=1}^n ij(i,j) \bmod p \] 做法 先用莫比乌斯反演拆一下式子 \[ \begin{split} \sum_{i ...

  7. 洛谷P3455 [POI2007]ZAP-Queries(莫比乌斯反演)

    传送门 设$$f(k)=\sum_{i=1}^{a}\sum_{j=1}^{b}[gcd(i,j)=k]$$ $$g(n)=\sum_{n|k}f(k)=\lfloor\frac{a}{n}\rflo ...

  8. 洛谷 - P1390 - 公约数的和 - 莫比乌斯反演 - 欧拉函数

    https://www.luogu.org/problemnew/show/P1390 求 $\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m} gcd(i,j) $ ...

  9. 洛谷P3312 [SDOI2014]数表(莫比乌斯反演+树状数组)

    传送门 不考虑$a$的影响 设$f(i)$为$i$的约数和 $$ans=\sum\limits_{i=1}^n\sum\limits_{j=1}^nf(gcd(i,j))$$ $$=\sum\limi ...

随机推荐

  1. java操作redis学习(一):安装及连接

    文章参考自:http://www.cnblogs.com/edisonfeng/p/3571870.html,在此基础上进行了修改. 一.下载安装Redis redis官网显示暂时不支持Windows ...

  2. c结构体里的数组与指针

    /* 訪问成员数组名事实上得到的是数组的相对地址.而訪问成员指针事实上是相对地址里的内容 */ struct buf_str { int length; char buf[0]; }; struct ...

  3. MySQL 导入导出命令(转载)

    导出数据: mysqldump --databases -u root -p密码 数据库名> /root/guogl/XXX.sql 从sql文件导入数据: mysql -u root -p密码 ...

  4. React Native组件解析(二)之Text

    React Native组件解析(二)之Text 1. 概述 Text组件对应于iOS的UILabel,Android的TextView,用来显示文本.但是Text组件的内部使用的并不是flexbox ...

  5. Erlang Shell调试网络程序真方便

    Erlang的shell功能强大,这里我将它当成我的客户端.可以动态的输入你需要发送的内容,也可以动态的接收内容,就像调试器一样,在开发过程中起到很重要的作用.具体使用方式如下: C:\Documen ...

  6. CentOS 7 yum安装路径查询方法

    先执行下面的命令,查看所有的已安装软件名称. rpm -qa 然后执行 rpm -ql 软件名称 就可以显示软件的安装路径.

  7. poj 2888 Magic Bracelet <polya定理>

    题目:http://poj.org/problem?id=2888 题意:给定n(n <= 10^9)颗珠子,组成一串项链,每颗珠子可以用m种颜色中一种来涂色,如果两种涂色方法通过旋转项链可以得 ...

  8. ubuntu搭建ftp

    腾讯云服务器linux Ubuntu操作系统安装ftp服务器vsftpd Ubuntu Server 16.04.1 LTS 64位 登录服务器  xshell 登录服务器 用户名如果没自定义默认:u ...

  9. windows64位安装mysql-5.7.12,图文

    linux下安装mysql教程一大片,我就不说了,再此说下windows 下如何安装这个5.7版本,并且有些坑已踩! 一:进入mysql下载地址:http://www.mysql.com/downlo ...

  10. BestCoder Round #92 1002 Count the Sheep —— 枚举+技巧

    题目链接:http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=748&pid=1002 题解: 做题的时候只是想到 ...