Description

栋栋有一块长方形的地,他在地上种了一种能量植物,这种植物可以采集太阳光的能量。在这些植物采集能量后,栋栋再使用一个能量汇集机器把这些植物采集到的能量汇集到一起。 栋栋的植物种得非常整齐,一共有\(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的能量损失。

Input

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

Output

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

Sample Input

5 4

Sample Output

36

HINT

对于\(10\%\)的数据:\(1 \le n,m \le 10\);

对于\(50\%\)的数据:\(1 \le n, m \le 100\);

对于\(80\%\)的数据:\(1 \le n, m \le 1000\);

对于\(90\%\)的数据:\(1 \le n, m \le 10000\);

对于\(100\%\)的数据:\(1 \le n, m \le 100000\)。

题目求$$\sum_{i=1}^{N} \sum_{j=1}^{M}2 \times gcd(i,j) - 1$$

转换变成枚举\(gcd\)求$$\sum_{g=1}^{min(N,M)}(2 \times g -1)\sum_{i = 1}^{N} \sum_{j = 1}^{M} [gcd(i,j) = g]$$

然后同BZOJ 2301 Problem b的做法进行莫比乌斯反演,就可以化成$$\sum_{g=1}{min(N,M)}\sum_{k=1}{min(\lfloor \frac{N}{g} \rfloor,\lfloor \frac{M}{g} \rfloor)} \mu(k) \lfloor \frac{N}{kg} \rfloor \lfloor \frac{M}{kg} \rfloor $$

由于$$\sum_{i=1}^{N} \frac{1}{i} \approx ln N$$

所以直接求这个式子复杂度是\(O(NlogN)\)。

由于人比较愚钝,所以我预处理了\(\mu\)的前缀和,还傻逼的\(\sqrt{N}\)分段了。

#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std; typedef long long ll;
#define maxn 100010
int n,m,tot,prime[maxn],mu[maxn];
bool exist[maxn]; ll ans; inline void find()
{
mu[1] = 1;
for (int i = 2;i <= n;++i)
{
if (!exist[i]) prime[++tot] = i,mu[i] = -1;
for (int j = 1;j <= tot&&i*prime[j]<=n;++j)
{
exist[i*prime[j]] = true;
if (i % prime[j] == 0) { mu[i*prime[j]] = 0; break; }
mu[i*prime[j]] = -mu[i];
}
}
for (int i = 1;i <= n;++i) mu[i] += mu[i-1];
} inline ll calc(int a,int b,int d)
{
a /= d; b /= d;
ll ret = 0; int pos;
for (int i = 1;i <= a;i = pos+1)
{
pos = min(a/(a/i),b/(b/i));
ret += (ll)(mu[pos]-mu[i-1])*(ll)(a/i)*(ll)(b/i);
}
return ret;
} int main()
{
freopen("2005.in","r",stdin);
freopen("2005.out","w",stdout);
scanf("%d %d",&n,&m); if (n > m) swap(n,m);
find();
for (int i = 1;i <= n;++i)
ans += (ll)((i<<1)-1)*calc(n,m,i);
printf("%lld",ans);
fclose(stdin); fclose(stdout);
return 0;
}

BZOJ 2005 能量采集的更多相关文章

  1. BZOJ 2005 能量采集(容斥原理)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2005 题意:给定n和m,求 思路:本题主要是解决对于给定的t,有多少对(i,j)满足x= ...

  2. bzoj 2005 能量采集 莫比乌斯反演

    我们要求的是∑ni=1∑mj=1(2×gcd(i,j)−1) 化简得2×∑ni=1∑mj=1gcd(i,j)−n×m 所以我们现在只需要求出∑ni=1∑mj=1gcd(i,j)即可 ∑ni=1∑mj= ...

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

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

  4. BZOJ 2005: [Noi2010]能量采集( 数论 + 容斥原理 )

    一个点(x, y)的能量损失为 (gcd(x, y) - 1) * 2 + 1 = gcd(x, y) *  2 - 1. 设g(i)为 gcd(x, y) = i ( 1 <= x <= ...

  5. BZOJ 2005 [Noi2010]能量采集 (数学+容斥 或 莫比乌斯反演)

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

  6. 【BZOJ】2005: [Noi2010]能量采集(欧拉函数+分块)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2005 首先和某题一样应该一样可以看出每个点所在的线上有gcd(x,y)-1个点挡着了自己... 那么 ...

  7. bzoj 2005: [Noi2010]能量采集 筛法||欧拉||莫比乌斯

    2005: [Noi2010]能量采集 Time Limit: 10 Sec  Memory Limit: 552 MB[Submit][Status][Discuss] Description 栋栋 ...

  8. 【BZOJ】【2005】【NOI2010】能量采集

    欧拉函数 玛雅,我应该先看看JZP的论文的……贾志鹏<线性筛法与积性函数>例题一 这题的做法……仔细想下可以得到:$ans=2*\sum_{a=1}^n\sum_{b=1}^m gcd(a ...

  9. 2005: [Noi2010]能量采集 - BZOJ

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

随机推荐

  1. 百度的android采访分析

    今天早上10分,我接到一个电话采访百度.当然,我说提前.我的病是多么强烈延迟.所以我也没怎么准备,当然,我也看他们的真实水平的思考.在这次审查中! ! ! ! ! !! .! ! ! !.!! !.! ...

  2. vim阅读c++代码的快捷键

    未完,待总结 1. 首先适用ctags建立当前工作目录的标签: cd /home/wanglc/WorkDirectory ctags -R or ctags -R * 命令结束以后,会生成一个tag ...

  3. [转载]js中__proto__和prototype的区别和关系

          首先,要明确几个点:1.在JS里,万物皆对象.方法(Function)是对象,方法的原型(Function.prototype)是对象.因此,它们都会具有对象共有的特点.即:对象具有属性_ ...

  4. 今天给大家分享一下Android中的资源与国际化的问题

    摘要:该文章将向大家分享Android中的资源与国际化的问题. 今天给大家分享一下Android中的资源与国际化的问题,通常我们新建一个Android工程,目录结构如下图所示: 我们主要看一下layo ...

  5. 微信上传图文消息invalid media_id hint,thumb_media_id怎么获取

    微信上传图文消息thumb_media_id, thumb_media_id怎么获取, 微信群发图文消息invalid media_id hint, 微信群发图文消息40007, 40007,inva ...

  6. Maven浅析-2 什么是Maven

    1.简单点讲:Maven就是一个项目构建工具.它可以生成一个artifact(component),还可以帮我们管理项目依赖(如附加的组件Filters等). 2.从整体讲:Maven也可以看作一个项 ...

  7. 将应用程序中的一些参数写到xml配置文件中

    最近碰到一个问题,需要将程序中的一些基本参数写到xml文件中,虽然网上有好多现成的代码,但是觉得对xml不熟悉,果断就研究了一下.先说一下大体思路吧,我设计了一个用来读取和回填的类,然后定义了一个接口 ...

  8. Windows环境下使用cygwin ndk_r9c编译FFmpeg

     一.废话 最近学习,第一步就是编译.我们需要编译FFmpag,x264,fdk_aac,一步步来.先来讲一下FFmpeg,网上说的很多都是几百年前的,我亲测完美可用 联系我可以直接评论,也可以加我Q ...

  9. js - SyntaxError: JSON.parse: unexpected character at line 1 column 2 of the JSON data jquery-1.9.1.min.js:3:4315

    FF中时不时报这个错, 就近段做项目来看,  一般是我通过 jquery获取form中的参数(或直接获取参数,并通过ajax进行异步请求的时候,如果有错,就抱该错误! 而对应的, 如果在 Google ...

  10. C# 反射 表达式树 模糊搜索

    反射实体T,非datetime字段反射获取表达式树   public static Expression<Func<T, bool>> GetSearchExpression& ...