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;
}

HDU-2841 Visible Trees(莫比乌斯反演)的更多相关文章

  1. HDU 2841 Visible Trees(莫比乌斯反演)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2841 题意:给n*m的矩阵(从(1,1)开始编号)格子,每个格子有一棵树,人站在(0,0)的位置,求可 ...

  2. HDU 2841 Visible Trees 数论+容斥原理

    H - Visible Trees Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u S ...

  3. HDU 2841 Visible Trees(容斥定理)

    Visible Trees Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) To ...

  4. HDU 2841 Visible Trees(数论)

    标题效果:给你个m*n方格,广场格从(1,1)开始. 在树中的每个点,然后让你(0,0)点往下看,问:你能看到几棵树. 解题思路:假设你的视线被后面的树和挡住的话以后在这条线上的树你是都看不见的啊.挡 ...

  5. hdu 2841 Visible Trees 容斥原理

    Visible Trees Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Pr ...

  6. hdu 2841 Visible Trees(容斥)

    原文链接 There are many trees forming a m * n grid, the grid starts from (1,1). Farmer Sherlock is stand ...

  7. hdu 2841 Visible Trees

    /** 大意: 求[1,m], [1,n] 之间有多少个数互素...做了 1695 ,,这题就so easy 了 **/ #include <iostream> #include < ...

  8. HDU 2841 Visible Trees(容斥)题解

    题意:有一块(1,1)到(m,n)的地,从(0,0)看能看到几块(如果两块地到看的地方三点一线,后面的地都看不到). 思路:一开始是想不到容斥...后来发现被遮住的地都有一个特点,若(a,b)有gcd ...

  9. HDU 2841 容斥 或 反演

    $n,m <= 1e5$ ,$i<=n$,$j<=m$,求$(i⊥j)$对数 /** @Date : 2017-09-26 23:01:05 * @FileName: HDU 284 ...

随机推荐

  1. react-native-vector-icons 安装、使用

    react-native-vector-icons 安装.使用 前言 任何库的安装与使用都离不开官文,按照官方文档一步步操作可以规避大多数问题.不过很多库只有英文文档,想要完全参透需要时间.react ...

  2. ArrayList、LinkedList、Vector、CopyOnWriteArrayList的区别和源码分析

    1. ArrayList ArrayList 是一个数组队列,相当于动态数组.与Java中的数组相比,它的容量能动态增长.它继承于AbstractList,实现了List, RandomAccess, ...

  3. Volatile是用于解决什么问题,谈谈实现原理

    一.volatile的作用 通常情况下我们可以通过Synchronized关键字来解决这些个问题,不过如果对Synchronized原理有了解的话,应该知道Synchronized是一个比较重量级的操 ...

  4. vux中x-input在安卓手机输入框的删除按钮(@on-click-clear-icon)点击没反应

    首先看你自己的的版本好,如果在2.6.9以上,我是在git上找到的解决办法,记录一下,希望可以帮到有需要的小伙伴. 在项目中找 node_modules > vux > x-input & ...

  5. C#反射与特性(三):反射类型的成员

    目录 1,获取类型的信息 1.1 类型的基类和接口 1.2 获取属性.字段成员 上一篇文章中,介绍如何获取 Type 类型,Type 类型是反射的基础. 本篇文章中,将使用 Type 去获取成员信息, ...

  6. 「UVA1328」Period 解题报告

    English题面 题意: 给你一个长度为n的字符串,依次取字符串前i个(前缀),如果前缀由k(k>0)个相同真子串构成,那么输出i和k 直到n为0结束,每组数据后要有一行空白 思路: KMP+ ...

  7. 1040 有几个PAT (25 分)C语言

    字符串 APPAPT 中包含了两个单词 PAT,其中第一个 PAT 是第 2 位§,第 4 位(A),第 6 位(T):第二个 PAT 是第 3 位§,第 4 位(A),第 6 位(T). 现给定字符 ...

  8. SpringBoot 总结篇

            时至今日,SpringBoot 系列文章也算是告一段落,回想起当初立flag的情景,仿佛还历历在目.用一个月时间学完 SpringBoot 并整理成文章?又定一些异想天开计划,当时这样 ...

  9. K8S与harbor的集成

    文章编写在有道云笔记,采用MarkDown编写,迁移太麻烦了,具体链接如下: http://note.youdao.com/noteshare?id=a9d344951e1fbb761ef7e4979 ...

  10. cassandra中的ACID,与RDBMS中的事务有何不同?

    Cassandra中的ACID标准 Apache Cassandra不遵循具有回滚或锁定机制的ACID(原子性,一致性,隔离性,持久性)事务,而是提供原子,隔离和持久的事务,并具有最终和可调的一致性, ...