BZOJ 2005 能量采集
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 能量采集的更多相关文章
- BZOJ 2005 能量采集(容斥原理)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2005 题意:给定n和m,求 思路:本题主要是解决对于给定的t,有多少对(i,j)满足x= ...
- 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= ...
- BZOJ 2005: [Noi2010]能量采集
2005: [Noi2010]能量采集 Time Limit: 10 Sec Memory Limit: 552 MBSubmit: 3312 Solved: 1971[Submit][Statu ...
- BZOJ 2005: [Noi2010]能量采集( 数论 + 容斥原理 )
一个点(x, y)的能量损失为 (gcd(x, y) - 1) * 2 + 1 = gcd(x, y) * 2 - 1. 设g(i)为 gcd(x, y) = i ( 1 <= x <= ...
- BZOJ 2005 [Noi2010]能量采集 (数学+容斥 或 莫比乌斯反演)
2005: [Noi2010]能量采集 Time Limit: 10 Sec Memory Limit: 552 MBSubmit: 4493 Solved: 2695[Submit][Statu ...
- 【BZOJ】2005: [Noi2010]能量采集(欧拉函数+分块)
http://www.lydsy.com/JudgeOnline/problem.php?id=2005 首先和某题一样应该一样可以看出每个点所在的线上有gcd(x,y)-1个点挡着了自己... 那么 ...
- bzoj 2005: [Noi2010]能量采集 筛法||欧拉||莫比乌斯
2005: [Noi2010]能量采集 Time Limit: 10 Sec Memory Limit: 552 MB[Submit][Status][Discuss] Description 栋栋 ...
- 【BZOJ】【2005】【NOI2010】能量采集
欧拉函数 玛雅,我应该先看看JZP的论文的……贾志鹏<线性筛法与积性函数>例题一 这题的做法……仔细想下可以得到:$ans=2*\sum_{a=1}^n\sum_{b=1}^m gcd(a ...
- 2005: [Noi2010]能量采集 - BZOJ
Description 栋栋有一块长方形的地,他在地上种了一种能量植物,这种植物可以采集太阳光的能量.在这些植物采集能量后,栋栋再使用一个能量汇集机器把这些植物采集到的能量汇集到一起. 栋栋的植物种得 ...
随机推荐
- STL algorithm算法merge(34)
merge原型: std::merge default (1) template <class InputIterator1, class InputIterator2, class Outpu ...
- Windows2012中安装域控(DC) + SQL Server 2014 + TFS 2015
安装域控(DC) 修改计算机名 修改固定IP 添加角色 选择“Role-based or feature-based installation” 选择本机 选择“Active Directory Do ...
- ASP.NET分页存储过程,解决搜索时丢失条件信息
存储过程: -- ============================================= -- Author: -- Create date: -- Description: 分页 ...
- 用Javascript评估用户输入密码的强度
<!-- 密码已经是我们生活工作中必不可少的工具,但一个不安全的密码有又有可能会给我们造成不必要的损失.作为网站设计者,如果我们在网页中能对用户输入的密码进行安全评估,并显示出相应的提示信息 ...
- PHP 根据值查找键名
array_search (PHP 4 >= 4.0.5, PHP 5) mixed array_search ( mixed $needle , array $haystack [, bool ...
- java 内部类学习
类和内部类的关系就如同人和心脏的关系. 实例1:内部类的基本结构 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 //外部 ...
- Java:Json与其他Java对象集合的转换
一.引入的jar包 json-lib-2.4-jdk15.jar 二.Json字符串转换为其他对象 1.对象==>json字符串 2.list和Map集合==>json字符串 3.Map集 ...
- Java环境变量批处理文件
缘由 公司需要配置大量的虚机,每个上面都要求安装 JAVA,配置环境变量,所以要求写一个批处理,一键配置环境变量 方式 网上找到了3中方式, 第一种是使用 set设置环境 变量,但是这样设置的只是临时 ...
- oracle数据库导入导出命令!(转)
oracle数据库导入导出命令! Oracle数据导入导出imp/exp 功能:Oracle数据导入导出imp/exp就相当与oracle数据还原与备份. 大多情况都可以用Oracle数据导入导出完成 ...
- WPF 带CheckBox、图标的TreeView
WPF 带CheckBox.图标的TreeView 在WPF实际项目开发的时候,经常会用到带CheckBox的TreeView,虽然微软在WPF的TreeView中没有提供该功能,但是微软在WPF中提 ...