题目描述

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

栋栋的植物种得非常整齐,一共有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. JAVA通用BaseServlet的产生和代码实现

    BaseServlet的作用: 我们先写一个工具类:BaseServlet. 我们知道,写一个项目可能会出现N多个Servlet,而且一般一个Servlet只有一个方法(doGet或doPost),如 ...

  2. LeetCode77. Combinations(剑指offer38-2)

    Given two integers n and k, return all possible combinations of k numbers out of 1 ... n. Example: I ...

  3. 屏蔽datatable错误提示

    $.fn.dataTable.ext.errMode = 'none'; //不显示任何错误信息// 以下为发生错误时的事件处理,如不处理,可不管.$('#productionRequestItems ...

  4. php集成开发环境xampp的搭建

    一:运维闲谈 作为一名linux运维工程师,在确保能够有熟练的服务器的搭建和维护优化技能的前提,还需对自身解决问题方法上做出一番功夫. 如何为自己的运维工作添砖加瓦,自动化运维便变得非常重要,一方面, ...

  5. PHP 微信公众号之客服完整讲解

    //获取access_token private static function get_access_token($app_id) { $getAuthorizerInfo = wx_auth::g ...

  6. Pandas基本命令

    关键缩写和包导入 在这个速查手册中,我们使用如下缩写: df:任意的Pandas DataFrame对象 同时我们需要做如下的引入: import pandas as pd 创建测试对象 import ...

  7. python3 练习题100例 (二十)

    #!/usr/bin/env python3# -*- coding: utf-8 -*-"""练习二十:判断一个年份是否是闰年公历闰年计算方法:1.普通年能被4整除且不 ...

  8. Wannafly挑战赛4. B

    Wannafly挑战赛4. B 题意:求子区间异或和,要求区间长度在l到r之间,并且为偶数 题解:对于每一位算贡献,可以分奇偶来记录,计算的时候只加上奇偶性相同的就保证了为偶数,从大于l的点开始每次+ ...

  9. spark中的RDD以及DAG

    今天,我们就先聊一下spark中的DAG以及RDD的相关的内容 1.DAG:有向无环图:有方向,无闭环,代表着数据的流向,这个DAG的边界则是Action方法的执行 2.如何将DAG切分stage,s ...

  10. PHP.22-Smart模版

    Smart模版 smarty是一个基于PHP开发的PHP模板引擎.它提供了逻辑与外在内容的分离,简单的讲,目的就是要使PHP程序员同美工分离,使用的程序员改变程序的逻辑内容不会影响到美工的页面设计,美 ...