题目描述

栋栋有一块长方形的地,他在地上种了一种能量植物,这种植物可以采集太阳光的能量。在这些植物采集能量后,栋栋再使用一个能量汇集机器把这些植物采集到的能量汇集到一起。

栋栋的植物种得非常整齐,一共有n列,每列有m棵,植物的横竖间距都一样,因此对于每一棵植物,栋栋可以用一个坐标(x, y)来表示,其中x的范围是1至n,表示是在第x列,y的范围是1至m,表示是在第x列的第y棵。

由于能量汇集机器较大,不便移动,栋栋将它放在了一个角上,坐标正好是(0, 0)。

能量汇集机器在汇集的过程中有一定的能量损失。如果一棵植物与能量汇集机器连接而成的线段上有k棵植物,则能 量的损失为2k + 1。例如,当能量汇集机器收集坐标为(2, 4)的植物时,由于连接线段上存在一棵植物(1, 2),会产生3的能量损失。注意,如果一棵植物与能量汇集机器连接的线段上没有植物,则能量损失为1。现在要计算总的能量损失。

下面给出了一个能量采集的例子,其中n = 5,m = 4,一共有20棵植物,在每棵植物上标明了能量汇集机器收集它的能量时产生的能量损失。

在这个例子中,总共产生了36的能量损失。

输入输出格式

输入格式:

仅包含一行,为两个整数n和m。

输出格式:

仅包含一个整数,表示总共产生的能量损失。

输入输出样例

输入样例#1:

5 4
输出样例#1:

36
输入样例#2:

3 4
输出样例#2:

20

说明

对于10%的数据:1 ≤ n, m ≤ 10;
对于50%的数据:1 ≤ n, m ≤ 100;
对于80%的数据:1 ≤ n, m ≤ 1000;
对于90%的数据:1 ≤ n, m ≤ 10,000;
对于100%的数据:1 ≤ n, m ≤ 100,000。

Solution:

  本题zyys。

  我们首先对图进行下分析,不难发现本题所求的是:$\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}{gcd(i,j)\times 2 - 1}$。

  直接暴力枚举显然行不通,但是不难发现,同一最小公约数$x$可能会出现多次,于是我们考虑求满足$i\leq n,j\leq m$的$gcd(i,j)=x$的个数$f[x]$,那么$x$对答案的贡献就是$f[x]\times (x\times 2 -1)$。

  那么显然$1\leq gcd(i,j)\leq min(n,m)$,直接枚举每个最小公约数$x$,那么$n$内的是$x$的倍数的数至少有$\lfloor{n/x}\rfloor$个,同理$m$内有$\lfloor{m/x}\rfloor$个,那么$x$作为公约数的数对共$\lfloor{n/x}\rfloor\times \lfloor{m/x}\rfloor$个,由于要求的是最小公约数$x$,显然上述数对中存在最小公约数为$x$倍数的数对,所以我们由容斥原理直接从上面的数对中减去最小公约数为$2\times x,3\times x,…k\times x\;,k\times x\leq min(n,m)$的数对个数。

  由于上面$x$的倍数都大于$x$,可以在枚举$x$之前处理,直接倒序循环就好了。

  最后统计累加答案。显然时间复杂度为调和级数,$O(n\log n)$。

代码:

#include<bits/stdc++.h>
#define il inline
#define ll long long
#define For(i,a,b) for(ll (i)=(a);(i)<=(b);(i)++)
#define Bor(i,a,b) for(ll (i)=(b);(i)>=(a);(i)--)
using namespace std;
const int N=;
ll n,m,f[N],ans; il int gi(){
int a=;char x=getchar();
while(x<''||x>'')x=getchar();
while(x>=''&&x<='')a=(a<<)+(a<<)+x-,x=getchar();
return a;
} int main(){
n=gi(),m=gi();
if(n>m)swap(n,m);
Bor(i,,n){
f[i]=(n/i)*(m/i);
for(ll j=;j*i<=n;j++)f[i]-=f[i*j];
ans+=f[i]*(i*-);
}
cout<<ans;
return ;
}

P1447 [NOI2010]能量采集的更多相关文章

  1. 洛谷P1447 - [NOI2010]能量采集

    Portal Description 给出\(n,m(n,m\leq10^5),\)计算\[ \sum_{i=1}^n \sum_{j=1}^m (2gcd(i,j)-1)\] Solution 简单 ...

  2. Luogu P1447 [NOI2010]能量采集

    Preface 最近反演题做多了看什么都想反演.这道题由于数据弱,解法多种多样,这里简单分析一下. 首先转化下题目就是对于一个点\((x,y)\),所消耗的能量就是\(2(\gcd(x,y)-1)+1 ...

  3. 洛谷 P2158 [SDOI2008]仪仗队 && 洛谷 P1447 [NOI2010]能量采集

    https://www.luogu.org/problemnew/show/P2158 以人所在位置为(0,0)建立坐标系, 显然除了(0,1)和(1,0)外,可以只在坐标(x,y)的gcd(x,y) ...

  4. 洛谷P1447 [NOI2010]能量采集(容斥)

    传送门 很明显题目要求的东西可以写成$\sum_{i=1}^{n}\sum_{j=1}^m gcd(i,j)*2-1$(一点都不明显) 如果直接枚举肯定爆炸 那么我们设$f[i]$表示存在公因数$i$ ...

  5. Luogu P1447 [NOI2010]能量采集 数论??欧拉

    刚学的欧拉反演(在最后)就用上了,挺好$qwq$ 题意:求$\sum_{i=1}^{N}\sum_{j=1}^{M}(2*gcd(i,j)-1)$ 原式 $=2*\sum_{i=1}^{N}\sum_ ...

  6. luogu P1447 [NOI2010]能量采集 欧拉反演

    题面 题目要我们求的东西可以化为: \[\sum_{i=1}^{n}\sum_{j=1}^{m}2*gcd(i,j)-1\] \[-nm+2\sum_{i=1}^{n}\sum_{j=1}^{m}gc ...

  7. 洛谷 P1447 [NOI2010]能量采集 (莫比乌斯反演)

    题意:问题可以转化成求$\sum_{i=1}^{n}\sum_{j=1}^{m}(2*gcd(i,j)-1)$ 将2和-1提出来可以得到:$2*\sum_{i=1}^{n}\sum_{j=1}^{m} ...

  8. BZOJ 2005: [Noi2010]能量采集

    2005: [Noi2010]能量采集 Time Limit: 10 Sec  Memory Limit: 552 MBSubmit: 3312  Solved: 1971[Submit][Statu ...

  9. noi2010 能量采集

    2005: [Noi2010]能量采集 Time Limit: 10 Sec  Memory Limit: 552 MB Submit: 3068  Solved: 1820 [Submit][Sta ...

随机推荐

  1. 什么是 BIND 变量?

    变量绑定会使联机事务处理过程(OLTP)系统数据库中的SQL执行速度飞快,内存效率极高:不使用绑定变量可能会使OLTP数据库不堪重负,资源被SQL解析严重耗尽,系统运行缓慢. 当一个用户与数据库建立连 ...

  2. 使用JavaScript动态的绑定、解绑 a 标签的onclick事件,防止重复点击

    页面上的 a 标签如下: <a class="more" style="cursor: pointer;" id="commentMore&qu ...

  3. yum 仓库配置

    [base]name=aliyum basebaseurl=https://mirrors.aliyun.com/centos/6/os/x86_64/                        ...

  4. Hibernate进阶学习4

    Hibernate进阶学习4 深入学习hibernate的查询语句 测试HQL查询 package com.hibernate.test; import com.hibernate.domain.Cu ...

  5. jsp <form>表单提交中如何在value属性中写表达式

    <input type="text" name="grop_id" value="<%=rs.getString(2)%>" ...

  6. 01U盘PE系统制作方法

    1. 需要的工具和安装包:WinPE镜像文件 WinPE_x86.iso .已制作好的另一个启动盘(下文以映像总裁为例,当然也可以使用大白菜.U启动等) . 电脑.准备制作PE系统的空U盘 2. 还原 ...

  7. PHP成随机字符串

    生成随机字符串 /** * 随机字符串 * @param int $len * @return string */ function randomStr($len = 32) { $chars = & ...

  8. java-访问控制修饰符

    访问权限 public    任何情况都可以访问 默认包 本包范围内可以访问到 protect       同一个包里的所有类所可以访问:所有子类(子类可以不和父类在同一个包)都可以访问 privat ...

  9. Redis数据库 : python与java操作redis

    redis 包 from redis import * 连接: r = StrictRedis(host='localhost', port='6379') 读写:r.set('key','value ...

  10. 简单php实现同一时间内一个账户只允许在一个终端登陆

    在账户表的基础上,我新建了一个账户account_session表,用来记录登录账户的account_id和最新一次登录成功用户的session_id,然后首先要修改登录方法:每次登录成功后,要将登录 ...