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. 那些年我们用过的组件-结构化日志组件 Serilog

    什么是结构化日志 我们记录日志惯常使用 log4j2.NLog 等日志组件,这些组件提供了输出到多种终端的能力,但是大部分时候我们选择将日志输出到操作系统的文件系统中,为什么呢?至少有一部分原因是记录 ...

  2. CLISP学习(二)

    它是一门函数式语言,你要用函数的思维来思考. 只不过与数学的表达不同的是,数学里的函数是在括号外  f(x) ,而lisp是在括号内,以列表的形式(f x), cos(x) --> (cos x ...

  3. windows安装wordcloud遇到的坑汇总

    pip install wordcloud报错,缺少visual studio包 不要偷懒,一定要从报错的地方去下载完整版本 然后安装c++ 重启后就不会报错了

  4. angular--连接服务获取数据并展示到页面加载结束禁用按钮-分页加载-管道使用

  5. day01-SpringMVC基本介绍-01

    SpringMVC介绍-01 1.离线文档 解压 spring-5.3.8-dist.zip文件. 位置:spring-framework-5.3.8/docs/reference/html/web. ...

  6. Sundial(一)

    Sundial 源码梳理 - v2.5.6 代码目录一览 通过入口点说明 实现IServiceCollection,并返回IServiceCollection(Extensions/ScheduleS ...

  7. C++迭代器种类与编译期间多态

    迭代器分类 C++ STL 中根据移动能力将迭代器分成了 5 类: Input Iterator 输入迭代器,只支持 operator++ 操作. Output Iterator 输出迭代器,只支持 ...

  8. drf-day4——序列化类常用字段和字段参数、序列化类source用法、序列化类定制字段返回内容的两种方式、序列化类的多表关联反序列化保存、反序列化字段校验、ModelSerializer的使用

    目录 一.序列化类常用字段和字段参数(了解) 1.1 常用字段类 1.2 常用字段参数 选项参数: 通用参数: 重点 二.序列化高级用法之source(了解) 2.1 序列化定制字段名字 三.序列化高 ...

  9. Swagger2多包扫描

    package com.xf.config; import org.springframework.context.annotation.Bean; import org.springframewor ...

  10. 分布式id的方案

    1 简介 在分布式系统架构中,通常会涉及到分布式全局唯一ID的生成 在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识. 如在金融.电商.支付.等产品的系统中,数据日渐增长,对数据分库分表后需 ...