(每日一题)P1447 [NOI2010] 能量采集(莫反套路 + 欧拉反演 / 容斥原理)
整理的算法模板合集: ACM模板
点我看算法全家桶系列!!!
实际上是一个全新的精炼模板整合计划
每日一题(莫反 / 多项式 / 母函数 / 群论) 2021.4.19 莫反
Problem
Solution
A. 莫比乌斯反演 + 欧拉反演
先简单解释一下本题解题第一步用到的显然的结论。
数轴上任意一点 (x1,y1)(x_1,y_1)(x1,y1) 到原点之间线段上的经过的点 (x2,y2)(x_2,y_2)(x2,y2) ,gcd(x2,y2)\gcd(x_2,y_2)gcd(x2,y2) 一定是 gcd(x1,y1)\gcd(x_1,y_1)gcd(x1,y1) 的因子。例如仪仗队那道题,从原点出发能看到的点一定都是 gcd(x,y)=1\gcd(x, y)=1gcd(x,y)=1 的点。从原点到 (x1,y1)(x_1,y_1)(x1,y1) 所以经过的点的个数就是 gcd(x1,y1)−1\gcd(x_1,y_1)-1gcd(x1,y1)−1(去掉自身)( (2,4)(2,4)(2,4) 会有因子 (1,2)(1,2)(1,2) )
证明来源:
Code
简单的代码:
Time
O(n+n)O(n+\sqrt n)O(n+n)
// Problem: P1447 [NOI2010] 能量采集
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P1447
// Memory Limit: 125 MB
// Time Limit: 1000 ms
//
// Powered by CP Editor (https://cpeditor.org)#include <bits/stdc++.h>
#define int long long
using namespace std;const int N = 500007;int primes[N], cnt, phi[N];
int n, m;
bool vis[N];
int sum[N];void init(int n)
{phi[1] = 1; for(int i = 2; i <= n; ++ i) {if(vis[i] == 0) {primes[ ++ cnt] = i;phi[i] = i - 1;}for(int j = 1; j <= cnt && i * primes[j] <= n; ++ j) {vis[i * primes[j]] = true;if(i % primes[j] == 0) {phi[i * primes[j]] = phi[i] * primes[j];break;} phi[i * primes[j]] = phi[i] * phi[primes[j]];}}for(int i = 1; i <= n; ++ i) {sum[i] = sum[i - 1] + phi[i]; }
}void solve()
{int res = 0;for(int l = 1, r; l <= n; l = r + 1) {r = min(n / (n / l), m / (m / l));res += (n / l) * (m / l) * (sum[r] - sum[l - 1]);//(sum[r] - sum[l - 1])已经是区间长度了}res = 2 * res - n * m;printf("%lld\n", res);
}signed main()
{init(N - 7);scanf("%lld%lld", &n, &m);if(n > m) swap(n, m);solve();return 0;
}
B. 容斥原理
时间复杂度 O(nlogn)O(nlogn)O(nlogn)
%%%
// Problem: P1447 [NOI2010] 能量采集
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P1447
// Memory Limit: 125 MB
// Time Limit: 1000 ms
//
// Powered by CP Editor (https://cpeditor.org)#include <bits/stdc++.h>
#define int long long
using namespace std;const int N = 500007;int n, m;
int f[N];signed main()
{scanf("%lld%lld", &n, &m);if(n > m) swap(n, m);int ans = 0;for(int i = n; i; -- i) {f[i] = (n / i) * (m / i);for(int j = i << 1; j <= n; j += i) f[i] -= f[j];ans += (2 * i - 1) * f[i];}printf("%lld\n", ans);return 0;
}
(每日一题)P1447 [NOI2010] 能量采集(莫反套路 + 欧拉反演 / 容斥原理)相关推荐
- P1447 [NOI2010]能量采集(mobius反演)
P1447 [NOI2010]能量采集 式子化简 显然题目就是要我们求∑i=1n∑j=1m2gcd(i,j)−1\sum_{i = 1} ^{n} \sum_{j = 1} ^{m} 2gcd(i, ...
- P1447 [NOI2010] 能量采集
P1447 [NOI2010] 能量采集 题意: 如果一棵植物与能量汇集机器(坐标为0,0)连接而成的线段上有 k 棵植物,则能量的损失为 2k + 1 给你一个n*m的植物园,问能量损失是多少 1& ...
- [NOI2010]能量采集
469. [NOI2010]能量采集 ★★☆ 输入文件:energy2010.in 输出文件:energy2010.out 简单对比 时间限制:1 s 内存限制:512 MB [问题描 ...
- (每日一题)P3768 简单的数学题(确信)(莫反 + 欧拉反演 + 杜教筛 )
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 每日一题(莫反 / 多项式 / 母函数 / 群论) 2021.4.20 莫反 和上午的那道题比较类似的 ...
- BZOJ 2005: [Noi2010]能量采集( 数论 + 容斥原理 )
一个点(x, y)的能量损失为 (gcd(x, y) - 1) * 2 + 1 = gcd(x, y) * 2 - 1. 设g(i)为 gcd(x, y) = i ( 1 <= x <= ...
- bz2005 2005: [Noi2010]能量采集 数学题
2005: [Noi2010]能量采集 Time Limit: 10 Sec Memory Limit: 552 MB Submit: 2494 Solved: 1475 [Submit][Sta ...
- bzoj2005: [Noi2010]能量采集
不知道什么算法. 首先求一颗植物(i,j)与能量采集器的连线上有几颗植物. 答案是(gcd(i,j)-1),设i'= i/gcd(i,j),j'=j/gcd(i,j). 则这几颗植物是(i'k,j'k ...
- NOI2010 能量采集
传送门 这个题观察一下之后发现,答案就是求 \[\sum_{i=1}^n\sum_{j=1}^mgcd(i,j) *2 - 1\] 那我们的目标就是求\(\sum_{i=1}^n\sum_{j=1}^ ...
- [2019.1.14]BZOJ2005 [Noi2010]能量采集
以下设\(n\ge m\). 首先,一个点\((x,y)\)到\((0,0)\)的路径上经过的点的数量(不包括首尾)为\(gcd(x,y)-1\). 所以它的能量损耗为\(2\times gcd(x, ...
最新文章
- 算法设计与分析第2章 递归与分治策略
- 【Kotlin】Kotlin 类的继承 三 ( super 关键字使用 | super@ 外部调用父类方法 | 子类选择性调用 父类 / 接口 方法 super )
- linux ps aux 结果解释
- [2020-09-11 CQBZ/HSZX多校联测 T3] 万猪拱塔(线段树+巧妙转化)
- 【Java】synchronized关键字笔记
- MySQL:数据库还原问题
- MVC公司架构介绍-工具类(一)
- 关于Oracle返回值
- Hbase权威指南(含目录,高清,免费)
- python面试专题--with 关键字与上下文管理
- linux下哪个输入法最好,[最好]linux下输入法→linux下输入法
- 数据挖掘导论课后习题答案-第六章
- 时间协议ntp服务器,时间服务器NTP搭建及NTP协议简介
- React 18 新特性-入门教程
- JAVA里面一加到一百等于多少_从1加到100等于多少 【求和算法汇总】
- 红米k50 刷入类原生教程
- 带你从头到尾梳理大图片加载OOM处理问题
- Android Mvc 模式
- 【学习】笔记本电脑重新安装系统win10
- linux系统 系统推荐 deepin国产系统 最好用的国产linux系统 Windows系统的优秀替代品 deepin系统安装 系统安装 deepin