[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, ...
随机推荐
- 51nod 1295 XOR key 可持久化01字典树
题意 给出一个长度为\(n\)的正整数数组\(a\),再给出\(q\)个询问,每次询问给出3个数,\(L,R,X(L<=R)\).求\(a[L]\)至\(a[R]\)这\(R-L+1\)个数中, ...
- BZOJ 3561 DZY Loves Math VI
BZOJ 3561 DZY Loves Math VI 求\(\sum_{i=1}^{n}\sum_{j=1}^{m}\text{lcm}(i,j)^{\gcd(i,j)}\),钦定\(n\leq m ...
- Nginx Windows版的服务安装和管理工具
以前研究过负载均衡,最近正在项目上实施(从来没做过小项目以上级别的东西,哈),nginx挺好,不过Windows有点为难,小流量和本地不追求性能,简单易用是目标. Nginx Windows上并没有提 ...
- [UWP 自定义控件]了解模板化控件(9):UI指南
1. 使用TemplateSettings统一外观 TemplateSettings提供一组只读属性,用于在新建ControlTemplate时使用这些约定的属性. 譬如,修改HeaderedCont ...
- spring boot 集成Druid
Druid是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0.DBCP.PROXOOL等DB池的优点,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行情况,可以说是针对监控而生的DB ...
- RabbitMQ --- Hello Mr.Tua
目录 RabbitMQ --- Work Queues(工作队列) RabbitMQ --- Publish/Subscribe(发布/订阅) RabbitMQ --- Routing(路由) 安装环 ...
- 【亲测有效】Github无法访问或者访问速度的解决方案
我相信,很多朋友都遇到了 Github 访问速度过慢的问题,我也是在此记下笔记,方便以后拿来使用. 第一步.修改Hosts 通过问题的搜索了解到 github 访问很慢一般通过修改 hosts 文件解 ...
- apache工作模式总结及网站访问缓慢处理记录
apache目前主要有两种模式:prefork模式和worker模式:1)prefork模式(默认模式)prefork是Unix平台上的默认(缺省)MPM,使用多个子进程,每个子进程只有一个线程.每个 ...
- 忘记mysql数据库root密码
找到配置文件my.ini ,然后将其打开,可以选择用记事本打开,查找的方法如下: 打开后,搜索mysqld关键字 找到后,在mysqld下面添加skip-grant-tables,保存退出. PS: ...
- windows上tomcat8的安装及配置
提示:在安装tomcat之前,确定安装好jdk. 一.下载tomcat8 http://tomcat.apache.org/download-80.cgi 点击这个网址 根据自己电脑的才做系统版本安装 ...