题目地址

http://acm.hdu.edu.cn/showproblem.php?pid=6715

题解

还是不会这题的容斥做法qwq。hjw当场写了个容斥A了。我推了个莫反,但是没反应过来我的式子能\(n\log n\)暴力算...

\[\begin{aligned}
&\sum_i \sum_j \mu(\frac{ij}{(i,j)})\\
&=\sum_{d} \sum_i \sum_j \mu(\frac{i}{d}) \mu(\frac{j}{d}) \mu(d) [(i,j)=d]\\
&=\sum_{d}\mu(d)\sum_i^{\frac{n}{d}} \sum_j ^\frac{m}{d} \mu(id)\mu(jd)[(i,j)=1]\\
&=\sum_{d}\mu(d)\sum_i^{\frac{n}{d}} \sum_j ^\frac{m}{d} \mu(id)\mu(jd)\sum_{k|(i,j)}\mu(k)\\
&=\sum_{d}\mu(d)\sum_{k=1}^{\frac{n}{d}} \mu(k)\sum_i^{\frac{n}{kd}} \sum_j ^\frac{m}{kd} \mu(kdi)\mu(kdj)\\
&设T=kd\\
&=\sum_T \left( \sum_{i} ^ {\frac{n}{T}} \mu(iT) \right) \left( \sum_{j} ^ {\frac{m}{T}} \mu(jT) \right)\sum_{d|T} \mu(d)\mu(\frac{T}{d})
\end{aligned}
\]

第一步就是利用了\(\mu\)是个积性函数的性质,\(i\)和\(j\)除掉\((i,j)\)后显然互质,然后再乘上\((i,j)\)即可得到\(\mu(\frac{ij}{(i,j)})\)了。

然后第二步是乘上了\(\mu^2 (d)\)(当\(d\)无平方因子时,\(\mu^2 (d)=1\),当有平方因子时本身这一项也是\(0\)),所以可以直接乘上\(\mu^2 (d)\)而不会对式子造成影响。

最后式子三个东西全都能\(n \log n\)埃筛筛出来...总复杂度\(O(T n \log n)\)

开了long long所以可能跑的比较慢...看起来是不用开的

#include <bits/stdc++.h>
using namespace std; namespace io {
char buf[1<<21], *p1 = buf, *p2 = buf, buf1[1<<21];
inline char gc() {
if(p1 != p2) return *p1++;
p1 = buf;
p2 = p1 + fread(buf, 1, 1 << 21, stdin);
return p1 == p2 ? EOF : *p1++;
}
#define G gc #ifndef ONLINE_JUDGE
#undef G
#define G getchar
#endif template<class I>
inline void read(I &x) {
x = 0; I f = 1; char c = G();
while(c < '0' || c > '9') {if(c == '-') f = -1; c = G(); }
while(c >= '0' && c <= '9') {x = x * 10 + c - '0'; c = G(); }
x *= f;
} template<class I>
inline void write(I x) {
if(x == 0) {putchar('0'); return;}
I tmp = x > 0 ? x : -x;
if(x < 0) putchar('-');
int cnt = 0;
while(tmp > 0) {
buf1[cnt++] = tmp % 10 + '0';
tmp /= 10;
}
while(cnt > 0) putchar(buf1[--cnt]);
} #define in(x) read(x)
#define outn(x) write(x), putchar('\n')
#define out(x) write(x), putchar(' ') } using namespace io; #define ll long long
const int N = 1000010; int T, n, m;
int p[N], cnt, vis[N];
ll mu[N], S1[N], S2[N], S3[N]; void init() {
mu[1] = 1;
for(int i = 2; i < N; ++i) {
if(!vis[i]) p[++cnt] = i, mu[i] = -1;
for(int j = 1; j <= cnt && i * p[j] < N; ++j) {
vis[i * p[j]] = 1;
if(i % p[j] == 0) {
mu[i * p[j]] = 0;
break;
}
mu[i * p[j]] = -mu[i];
}
}
for(int i = 1; i < N; ++i) {
for(int j = i; j < N; j += i) {
S3[j] += mu[i] * mu[j / i];
}
}
} int main() {
init(); read(T);
while(T--) {
read(n); read(m);
for(int i = 1; i <= max(n, m); ++i) S1[i] = S2[i] = 0;
if(n > m) swap(n, m);
for(int i = 1; i <= n; ++i)
for(int j = i; j <= n; j += i)
S1[i] += mu[j];
for(int i = 1; i <= m; ++i)
for(int j = i; j <= m; j += i)
S2[i] += mu[j];
ll ans = 0;
for(int i = 1; i <= n; ++i) {
ans += S1[i] * S2[i] * S3[i];
}
outn(ans);
}
}

最新文章

  1. Google Analytics 链接点击次数记录
  2. 你的USB设备还安全吗?USB的安全性已从根本上被打破!
  3. asp.net gridview 鼠标悬浮提示信息
  4. java并发编程(4)--线程池的使用
  5. Hadoop入门进阶课程6--MapReduce应用案例
  6. Android 6.0删除Apache HttpClient相关类的解决方法
  7. 【HTML】Advanced7:HTML5 Forms Pt. 2: Attributes and Data Lists
  8. MVC中,查询以异步呈现,分页不用异步的解决方案
  9. PowerDesigner 的常用小技巧 转
  10. Algorithms 4th - 1.1 Basic Programming Model - CREATIVE PROBLEMS
  11. C++数据类型简析
  12. Excel中choose函数的使用方法
  13. 服务器数据恢复_服务器xfs数据丢失数据恢复
  14. ansible roles
  15. Linux命令:help
  16. asp.net执行顺速
  17. CentOS 下搭建Jenkins
  18. Android 多用户多缓存的简单处理方案
  19. php之快速入门学习-15(php函数)
  20. flexible.js框架改写

热门文章

  1. servlet 读取文件
  2. 04 Mybatis 框架的环境搭建及入门案例
  3. [转帖]UID卡、CUID卡、FUID卡、UFUID卡的区别及写入方式
  4. Automatically generating nice graphs at end of your Load Test with Apache JMeter and JMeter-Plugins
  5. Java开发笔记(一百三十七)JavaFX的标签
  6. PAT(B) 1045 快速排序(C)
  7. Linux 中的 ~/. 表示的意思
  8. AX导出excel设置格式
  9. Intel realSense ubuntu 16.04+python 环境配置指南
  10. C#学习笔记------参数