[luogu1447][bzoj2005][NOI2010]能量采集
题目大意
求出\(\sum_{i=1}^{n} \sum_{i=1}^{m} gcd(i,j)\times 2 -1\)。
题解
解法还是非常的巧妙的,我们考虑容斥原理。我们定义\(f[i]\)表示\(gcd(x,y)\)的数对的个数,但是我们可以发现这样的状态并不好直接转移。那么我们就从\(f[i]\)的倍数入手(也就是\(gcd(x,y)\)的倍数入手,这样比较好理解),先定义\(g[i]\)为在数对\((x,y)\)中\(gcd(x,y)\)是\(i\)的倍数的个数。这种思想比较像线性筛素数。
对于一开始的\(g[i]\)就是\(\frac{n\times m}{i^2}\)。关于这个玩意的证明我还是不怎么会,但是好像听其他大佬说:你太弱了,这是显而易见的。(emm~~我果然是太弱了)
那么我们就当这个东西是显而易见的好了,如果有证明我会回来补坑的。(应该也有很多小伙伴也不知道这个东西怎么证明)(可能是我太菜了,不要吐槽我QAQ)。
证明(update by 2019/3/3 19.33)
是我脑子出问题了,其实画一个图就出来的事情,还搞得怎么复杂。证明简单,如下:
已知:\(x\in [1,n]\)且\(y\in [1,m]\)。
求证:\(gcd(x,y)\)的倍数(包括\(1\)倍)的个数有\(\frac{n\times m}{gcd(x,y)^2}\)。
证明:我们假设\(g=gcd(x,y)\),那么可以得到最小的数对就是\((1,g)\)和\((g,1)\),那么非常显然数对\((g,g)\)的\(gcd\)也是\(g\)的倍数,那么也可以推出在\([1,n]\)和\([1,m]\)的范围内,在横排上有\(n/g\)和\(m/g\),根据乘法原理,所有的点对的个数就是\(n*m/(g^2)\)。
得到这些倍数之后,因为我们是算倍数,在\(g[i]\)中包含了\(g[i\times 2]+\cdots+g[i\times k] \ (i\times k<=min(n,m))\),那么容斥原理把这些重复的部分减去就可以了,也就是\(f[i]=f[i]-g[i\times2]-g[i\times3]-\cdots-g[i\times k] \ (i\times k<=min(n,m))\)
小小的细节:因为我们是要算出倍数,那么我们倍数必须要先算出来,那么在枚举是我们要从后向前枚举,是不是非常好理解。
ac代码
# include <cstdio>
# include <cstring>
# include <algorithm>
# include <ctype.h>
# include <iostream>
# include <cmath>
# include <map>
# include <vector>
# include <queue>
# define LL long long
# define ms(a,b) memset(a,b,sizeof(a))
# define ri (register int)
# define inf (0x7f7f7f7f)
# define pb push_back
# define fi first
# define se second
# define pii pair<int,int>
# define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
using namespace std;
inline int gi(){
int w=0,x=0;char ch=0;
while(!isdigit(ch)) w|=ch=='-',ch=getchar();
while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
return w?-x:x;
}
# define N 100005
int n,m;
LL ans,f[N];
int main(){
n=gi(),m=gi();
for (int i=n;i>=1;i--){
f[i]=(LL)(n/i)*(m/i);
for (int j=2*i;j<=min(n,m);j+=i) f[i]-=f[j];//容斥原理,减去重复的部分
ans+=(LL)(i*2-1)*f[i];
}
printf("%lld\n",ans);
return 0;
}
[luogu1447][bzoj2005][NOI2010]能量采集的更多相关文章
- BZOJ2005 NOI2010 能量采集 【莫比乌斯反演】
BZOJ2005 NOI2010 能量采集 Description 栋栋有一块长方形的地,他在地上种了一种能量植物,这种植物可以采集太阳光的能量.在这些植物采集能量后,栋栋再使用一个能量汇集机器把这些 ...
- bzoj2005: [Noi2010]能量采集
lsj师兄的题解 一个点(x, y)的能量损失为 (gcd(x, y) - 1) * 2 + 1 = gcd(x, y) * 2 - 1. 设g(i)为 gcd(x, y) = i ( 1 < ...
- [BZOJ2005][Noi2010]能量采集 容斥+数论
2005: [Noi2010]能量采集 Time Limit: 10 Sec Memory Limit: 552 MBSubmit: 4394 Solved: 2624[Submit][Statu ...
- BZOJ2005:[NOI2010]能量采集(莫比乌斯反演,欧拉函数)
Description 栋栋有一块长方形的地,他在地上种了一种能量植物,这种植物可以采集太阳光的能量.在这些植物采集能量后,栋栋再使用一个能量汇集机器把这些植物采集到的能量汇集到一起. 栋栋的植物种得 ...
- BZOJ2005: [Noi2010]能量采集(容斥原理 莫比乌斯反演)
Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 4727 Solved: 2877[Submit][Status][Discuss] Descript ...
- [bzoj2005][Noi2010][能量采集] (容斥 or 欧拉函数)
Description 栋栋有一块长方形的地,他在地上种了一种能量植物,这种植物可以采集太阳光的能量.在这些植物采集能量后, 栋栋再使用一个能量汇集机器把这些植物采集到的能量汇集到一起. 栋栋的植物种 ...
- BZOJ2005: [Noi2010]能量采集(欧拉函数)
Description 栋栋有一块长方形的地,他在地上种了一种能量植物,这种植物可以采集太阳光的能量.在这些植物采集能量后, 栋栋再使用一个能量汇集机器把这些植物采集到的能量汇集到一起. 栋栋的植物种 ...
- BZOJ2005: [Noi2010]能量采集 莫比乌斯反演的另一种方法——nlogn筛
分析:http://www.cnblogs.com/huhuuu/archive/2011/11/25/2263803.html 注:从这个题收获了两点 1,第一象限(x,y)到(0,0)的线段上整点 ...
- 【莫比乌斯反演】BZOJ2005 [NOI2010]能量采集
Description 求sigma gcd(x,y)*2-1,1<=x<=n, 1<=y<=m.n, m<=1e5. Solution f(n)为gcd正好是n的(x, ...
随机推荐
- Dell Technology Summit(2018.10.17)
时间:2018.10.17地点:北京国家会议中心
- Luogu P1330 封锁阳光大学
这是一道神坑题! 刚开始看了题还以为是Tarjan(我也不知道Tarjan有什么用). 然后发现这是染色问题的模板题! 找到没有染色的点,然后将它涂成1(一共只有1,2两种颜色) 与它相连的点进行广搜 ...
- Scala学习(七)---包和引入
包和引入 摘要: 在本篇中,你将会了解到Scala中的包和引入语句是如何工作的.相比Java不论是包还是引入都更加符合常规,也更灵活一些.本篇的要点包括: 1. 包也可以像内部类那样嵌套 2. 包路径 ...
- Google BreakPad使用集
Google Breakpad 学习笔记 - 简书 Qt中使用Google Breakpad捕获程序崩溃异常_Linux编程_Linux公社-Linux系统门户网站
- GNU构建系统和AutoTools
注:本篇博客是阅读文末[参考博客]的讲解所写,内容非原创,仅是学习笔记 1. 概述2. 不同视角的程序构建2.1 用户视角2.2 开发者视角3. 导图图片4. configure选项参考博客 1. 概 ...
- Unity接入Steamworks
一.将scrpts/Steamworks.net/SteamManager组件添加到游戏物体上 二.修改SteamManager的代码为游戏的id如图所示 三.Unity,打开项目根目录,修改stea ...
- Mongodb副本集+分片集群环境部署记录
前面详细介绍了mongodb的副本集和分片的原理,这里就不赘述了.下面记录Mongodb副本集+分片集群环境部署过程: MongoDB Sharding Cluster,需要三种角色: Shard S ...
- Nginx入门【转】
原文地址:http://blog.csdn.net/u012486840/article/details/53098890 1.静态HTTP服务器 首先,Nginx是一个HTTP服务器,可以将服务器上 ...
- Linux内核及分析 第六周 分析Linux内核创建一个新进程的过程
实验过程 1.github上克隆相应的mengning/menu.git 2.测试menuOS,测试fork直接执行结果 3.配置调试系统,进入gdb调试,利用file linux-3.18.6/vm ...
- is interest important?
学习是不是一定要看兴趣呢?高中时觉得只要肯学即使不喜欢又能如何,大学之后被深深打脸,面对一周那么多的实习和报告,我悄悄告诉自己不是这块料 有一些事情我就是学不会.我却很容易相信一个人. 因此,无论我如 ...