Link

题解:

$ans = \sum_{i = 1}^{n}\sum_{j = 1}^{n}phi(gcd(phi(i), phi(j)))$

$=\sum_{d = 1}^{n}phi(d)\sum_{i = 1}^{n}\sum_{j = 1}^{n}[gcd(phi(i), phi(j))=d]$

$=\sum_{d = 1}^{n}phi(d)\sum_{i = 1}^{\left \lfloor \frac{n}{d}\right \rfloor}\sum_{j = 1}^{\left \lfloor \frac{n}{d}\right \rfloor}[gcd(phi(i*d),phi(j*d))=d]$

令$s(x)$表示$\sum_{i = 1}^{n}[phi(i) = x]$,则上式转化为:

$\sum_{d = 1}^{n}phi(d)\sum_{i = 1}^{\left \lfloor \frac{n}{d}\right \rfloor}\sum_{j = 1}^{\left \lfloor \frac{n}{d}\right \rfloor}s(i*d)*s(j*d)[gcd(i,j) = 1]$

$=\sum_{d = 1}^{n}phi(d)\sum_{t = 1}^{\left \lfloor \frac{n}{d}\right \rfloor}u(t)\sum_{i = 1}^{\left \lfloor \frac{n}{d * t}\right \rfloor}\sum_{j = 1}^{\left \lfloor \frac{n}{d*t}\right \rfloor}s(i*d*t)*s(j*d*t)$

令$D=d*t$,考虑枚举$D$,则上式转化为:

$\sum_{D = 1}^{n}\sum_{i = 1}^{\left \lfloor \frac{n}{D}\right \rfloor}\sum_{j = 1}^{\left \lfloor \frac{n}{D}\right \rfloor}s(i*D)*s(j*D)\sum_{t|D}u(t)*phi(\frac{D}{t})$

令$h(x)=\sum_{t|x}u(t)*phi(\frac{D}{t})$,则上式转化为:

$\sum_{D=1}^{n}h(D)\sum_{i = 1}^{\left \lfloor \frac{n}{D}\right \rfloor}s(i*D)\sum_{j = 1}^{\left \lfloor \frac{n}{D}\right \rfloor}s(j*D)$

令$f(x)=\sum_{i=1}^{\left \lfloor \frac{n}{x}\right \rfloor}s(i*x)$,则上式转化为:

$\sum_{D = 1}^{n}h(D)f(D)^{2}$

$h$是积性函数可以线性筛,求$f$的过程只需枚举两个因子的乘积,将贡献加到这两个因子上。注意根据我所说的这种统计方法显然每个$f$都会被重复统计一次,所以在计算答案时应该及时除以$2$。

#include <bits/stdc++.h>
#define re register
using namespace std;
typedef long long ll; const int N = 2e6 + 5; bool tag[N];
int mu[N], phi[N], p[N], low[N], cnt;
ll f[N], h[N], s[N]; void getPrime() {
mu[1] = 1;
phi[1] = 1;
low[1] = 1;
h[1] = 1;
for(int i = 2; i < N; i++) {
if(!tag[i]) {
p[++cnt] = i;
mu[i] = -1;
phi[i] = i - 1;
low[i] = i;
h[i] = i - 2;
}
for(int j = 1; j <= cnt && p[j] * i < N; j++) {
tag[i * p[j]] = true;
if(i % p[j] == 0) {
mu[i * p[j]] = 0;
phi[i * p[j]] = phi[i] * p[j];
low[i * p[j]] = low[i] * p[j];
if(low[i] == i) {
if(i == p[j]) h[i * p[j]] = h[i] * p[j] + 1;
else h[i * p[j]] = h[i] * p[j];
} else h[i * p[j]] = h[i / low[i]] * h[p[j] * low[i]];
break;
}
mu[i * p[j]] = -mu[i];
phi[i * p[j]] = phi[i] * (p[j] - 1);
low[i * p[j]] = p[j];
h[i * p[j]] = h[i] * h[p[j]];
}
}
} int main() {
getPrime();
int T; scanf("%d", &T);
while(T--) {
int n; scanf("%d", &n);
memset(f, 0, sizeof f);
memset(s, 0, sizeof s);
for(int i = 1; i <= n; i++) s[phi[i]]++;
for(int i = 1; i <= n; i++) {
for(int j = 1; j * i <= n; j++) f[i] += s[i * j], f[j] += s[i * j];
}
ll ans = 0;
for(int i = 1; i <= n; i++) ans += h[i] * f[i] * f[i] / 4;
printf("%lld\n", ans);
}
return 0;
}

51nod 1594 Gcd and Phi的更多相关文章

  1. 51nod 1594 Gcd and Phi(莫比乌斯反演)

    题目链接 传送门 思路 如果这题是这样的: \[ F(n)=\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}\phi(gcd(i,j)) \] 那么我们可能会想到下 ...

  2. 51nod 1594 Gcd and Phi 反演

    OTZ 又被吊打了...我当初学的都去哪了??? 思路:反演套路? 提交:\(1\)次 题解: 求\(\sum_{i=1}^{n}\sum_{j=1}^{n}\varphi(gcd(\varphi(i ...

  3. 【51nod】1594 Gcd and Phi

    题解 跟随小迪学姐的步伐,学习一下数论 小迪学姐太巨了! 这道题的式子很好推嘛 \(\sum_{i = 1}^{n} \sum_{j = 1}^{n} \sum_{d|\phi(i),\phi(j)} ...

  4. 51NOD 1594:Gcd and Phi——题解

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1594 参考及详细推导:http://www.cnblogs.com/ri ...

  5. 51nod 1575 Gcd and Lcm

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1575 万年巨坑终于填掉了…… 首先是煞笔西瓜的做题历程O_O. ...

  6. 【莫比乌斯反演】51nod1594 Gcd and Phi

    题解 显然可以O(nlogn)计算 代码 //by 减维 #include<set> #include<map> #include<queue> #include& ...

  7. 【反演复习计划】【51nod1594】Gcd and Phi

    现在感觉反演好多都是套路QAQ…… #include<bits/stdc++.h> using namespace std; ; typedef long long ll; int n,c ...

  8. 51Nod 2026 Gcd and Lcm

    题目传送门 分析: 开始玩一个小小的trick 我们发现\(f(n)=\sum_{d|n}\mu(d)\cdot d\)是一个积性函数 所以: \(~~~~f(n)=\prod f(p_i^{a_i} ...

  9. 【HDU 4992】 Primitive Roots (原根)

    Primitive Roots   Description We say that integer x, 0 < x < n, is a primitive root modulo n i ...

  10. RSA密码体制

    公钥算法的基本数论知识 公钥密码学中大部分引用了数论的成果,所以必要在介绍RSA密码体制之前,详细介绍一下所使用的几个数论的知识点 欧几里得算法 欧几里得算法主要是解决最大公约数问题,记两个正整数\( ...

随机推荐

  1. Rust-01 启航

    安装 所谓工欲善其事必先利其器,我们学习Rust当然需要安装Rust.我们可以从Rust官网下载rustup工具进行rust的安装.安装完成后,我们在命令行中输入rustc --version便可以查 ...

  2. UnoCSS 简化 CSS 的书写,Nice!

    CSS 样式太多,重复写 在学习 UnoCSS 之前,我提出几个问题: 你是否有过写完了 HTML 之后,跳转到 style 写 CSS 这样来回跳转的痛苦? 你是否有过不知道如何给节点取类名的痛苦( ...

  3. Docker命令的自动补齐

    Docker命令的自动补齐 背景 在linux下输入命令或文件都是可以自动补齐的,这个特性极大的提高了我们的效率,多数情况下我们很少用命令参数的自动补齐. 但对docker git这类参数特别多的命令 ...

  4. 城市路(Dijkstra)

    这道题目需要用到 Dijkstra plus 版(堆优化) 模板还是一样就是有几个点值得注意 1.这里用的是优先队列,原版需要搜出最小,并且没用过的点,省时间就剩在这里用小根堆就可以完美解决这个问题. ...

  5. Symbol.iterator 迷惑行为

  6. 汉诺塔 Java && Cpp 实现

    不论多少盘,都看成是两个盘在移动,只需要把上面的两个盘移动好就行. public static void hanoiTower(int num,char a,char b ,char c) { if( ...

  7. C# 委托原理刨析,外加和事件对比

    什么是委托 委托是一种引用类型,表示对具有特定参数列表和返回类型的方法的引用. 在实例化委托时,你可以将其实例与任何具有兼容参数和返回类型的方法进行绑定. 你可以通过委托实例调用方法. 简单的理解,委 ...

  8. UEFI引导安装UBUNUT

    1.引导方式一定要选UEFI,否则一些显卡驱动将不能安装 2.安装的时候,要在第四个界面,也就是选择覆盖安装还是保留双系统的那个界面,选择其他,一定要自己分区 3.分区: 4.一共5个重要分区: 1. ...

  9. NET近期面试总结和面试题

    一.面试总结 避坑:深圳龙岗李朗YH股份会鸽offer 因为offer被鸽重新找工作,从8号开始面试到12号(11家公司),整体感觉面试难度不大,就是很多公司都是走流程,并不是真的需要人,有些甚至聊一 ...

  10. Spring(Ioc DI、Spring的继承-依赖)

    IoC Di Di 指的是bean之间的依赖注入,设置对象之间的级联关系 Classes: package com.southwind.entity; import lombok.Data; @Dat ...