Visible Trees

传送门

解题思路:

实际上的答案就是1n与1m之间互质的数的对数,写出式子就是

\(ans=\sum^{n}_{i=1}\sum^{m}_{j=1}[gcd(i,j)=1]\)

由莫比乌斯反演引理

\(\sum_{d|n}\mu(d)=\epsilon(n)=[n=1]\)将\(\epsilon(n)\)替换为\([gcd(i,j)=1]\)有

\(\sum_{d|gcd(i,j)}\mu(d)=[gcd(i,j)=1]\)

\(ans=\sum^{n}_{i=1}\sum^{m}_{j=1}[gcd(i,j)=1]=\sum^{n}_{i=1}\sum^{m}_{j=1}\sum_{d|gcd(i,j)}\mu(d)\)

现在枚举\(d\)

由于\(d\)同时是\(i,j\)的因子

\(ans=\sum^n_{d=1}\mu(d)*\lfloor\frac{n}{d}\rfloor\lfloor\frac{m}{d}\rfloor\)

后面\(\mu(d)*\lfloor\frac{n}{d}\rfloor\lfloor\frac{m}{d}\rfloor\)能数论分块做,复杂度\(O(\sqrt{n})\)

还是挺套路的

具体实现

#include <bits/stdc++.h>
using namespace std;
/* freopen("k.in", "r", stdin);
freopen("k.out", "w", stdout); */
// clock_t c1 = clock();
// std::cerr << "Time:" << clock() - c1 <<"ms" << std::endl;
//#pragma comment(linker, "/STACK:1024000000,1024000000")
#define de(a) cout << #a << " = " << a << endl
#define rep(i, a, n) for (int i = a; i <= n; i++)
#define per(i, a, n) for (int i = n; i >= a; i--)
#define ls ((x) << 1)
#define rs ((x) << 1 | 1)
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> PII;
typedef pair<double, double> PDD;
typedef pair<ll, ll> PLL;
typedef vector<int, int> VII;
#define inf 0x3f3f3f3f
const ll INF = 0x3f3f3f3f3f3f3f3f;
const ll MAXN = 1e6 + 7;
const ll MAXM = 1e5 + 7;
const ll MOD = 1e9 + 7;
const double eps = 1e-6;
const double pi = acos(-1.0);
ll mu[MAXN], pri[MAXN], vis[MAXN], tot = 0;
ll sum[MAXN];
void init()
{
mu[1] = 1;
for (int i = 2; i < MAXN; i++)
{
if (!vis[i])
pri[++tot] = i, mu[i] = -1;
for (int j = 1; j <= tot && pri[j] * i < MAXN; j++)
{
vis[i * pri[j]] = 1;
if (i % pri[j] == 0)
mu[i * pri[j]] = 0;
else
mu[i * pri[j]] = -mu[i];
}
}
for (int i = 1; i < MAXN; i++)
sum[i] = sum[i - 1] + mu[i];
}
ll go(int n, int m)
{
ll ans = 0;
int last = 0;
for (int l = 1; l <= n; l = last + 1)
{
last = min((n / (n / l)), (m / (m / l)));
ans += (sum[last] - sum[l - 1]) * (n / l) * (m / l);
}
return ans;
}
int main()
{
init();
int t;
scanf("%d", &t);
while (t--)
{
int n, m;
scanf("%d%d", &n, &m);
if (n > m)
swap(n, m);
printf("%lld\n", go(n, m));
}
return 0;
}

最新文章

  1. Linux 部署 nginx服务代理
  2. java单例模式
  3. Proxy(代理)-对象结构型模式
  4. 20款高质量的 HTML5 网站模板【免费下载】
  5. sublime 支持php语法错误提示的插件
  6. java继承内部类问题(java编程思想笔记)
  7. cookie的保存时间
  8. Global.asax.cs介绍
  9. Codeforces Gym 100523E E - Gophers SET
  10. recovery编译汉化
  11. poj1201 Intervals【差分约束+SPFA】
  12. HTTP BIN测试
  13. linux命令: tree的c实现
  14. [Python] wxPython 编辑框组件学习总结 (原创)
  15. Django---路由、配置和静态文件简介
  16. Python 入门小实例笔记
  17. BZOJ 4480 [JSOI2013] 快乐的jyy
  18. List转Json函数
  19. 浪潮IOT知识点
  20. set集合遍历

热门文章

  1. 第二阶段:4.商业需求文档MRD:2.PRD-功能详细说明
  2. 记录我的 python 学习历程-Day11 两个被忽视的坑、补充知识点、函数名的应用、新版格式化输出、迭代器
  3. mysql主从之半同步复制和lossless无损复制
  4. 洛谷$P2050\ [NOI2012]$美食节 网络流
  5. 高德API对接
  6. java socket通讯
  7. bootstrapValidator JS修改内容无法验证
  8. 【转】【e周美文】优秀博客上榜推荐
  9. 探究Dubbo的拓展机制: 下
  10. stars-one原创工具——蓝奏云批量下载工具