2005: [Noi2010]能量采集 - BZOJ

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
【样例输入1】
5 4

【样例输入2】
3 4

Sample Output
【样例输出1】
36

【样例输出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。

囧,最后还是翻了题解

其实暴力算是nlogn的,我们算gcd=d的个数时,初始为(n/d)*(m/d),然后减去2*d,3*d,4*d....的

然后复杂度就是O(n/1+n/2+n/3+n/4+...+n/n),大概比nlogn还小一些

 1 const
 2     maxn=1000000;
 3 var
 4     f:array[0..maxn]of int64;
 5     n,m:longint;
 6     ans:int64;
 7
 8 procedure main;
 9 var
10     i,j,t:longint;
11 begin
12     read(n,m);
13     if n>m then t:=m
14     else t:=n;
15     for i:=t downto 1 do
16         begin
17             f[i]:=trunc(n/i)*trunc(m/i);
18             j:=i*2;
19             while j<=t do
20                 begin
21                     dec(f[i],f[j]);
22                     inc(j,i);
23                 end;
24             inc(ans,f[i]*i);
25         end;
26     ans:=ans*2-int64(n)*m;
27     writeln(ans);
28 end;
29
30 begin
31     main;
32 end.

2005: [Noi2010]能量采集 - BZOJ

时间: 2024-10-06 09:01:57

2005: [Noi2010]能量采集 - BZOJ的相关文章

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

一个点(x, y)的能量损失为 (gcd(x, y) - 1) * 2 + 1 = gcd(x, y) *  2 - 1. 设g(i)为 gcd(x, y) = i ( 1 <= x <= n, 1 <= y <= m ) 的数对(x, y)个数. 这个不好求, 考虑容斥, 设f(i) 为含有公因数 i 的数对(x, y)(1 <= x <= n, 1 <= y <= m)个数 , 显然f(i) = (n / i) * (m / i). 则 g(i) = f

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

2005: [Noi2010]能量采集 Time Limit: 10 Sec  Memory Limit: 552 MB[Submit][Status][Discuss] Description 栋栋有一块长方形的地,他在地上种了一种能量植物,这种植物可以采集太阳光的能量.在这些植物采集能量后, 栋栋再使用一个能量汇集机器把这些植物采集到的能量汇集到一起. 栋栋的植物种得非常整齐,一共有n列,每列 有m棵,植物的横竖间距都一样,因此对于每一棵植物,栋栋可以用一个坐标(x, y)来表示,其中x的范

2005: [Noi2010]能量采集

2005: [Noi2010]能量采集 Time Limit: 10 Sec  Memory Limit: 552 MBSubmit: 1831  Solved: 1086[Submit][Status] Description 栋栋有一块长方形的地,他在地上种了一种能量植物,这种植物可以采集太阳光的能量.在这些植物采集能量后,栋栋再使用一个能量汇集机器把这些植物采集到的能量汇集到一起. 栋栋的植物种得非常整齐,一共有n列,每列有m棵,植物的横竖间距都一样,因此对于每一棵植物,栋栋可以用一个坐标

BZOJ 2005 [Noi2010]能量采集 (容斥)

[Noi2010]能量采集 Time Limit: 10 Sec  Memory Limit: 552 MB Submit: 2324  Solved: 1387 [Submit][Status][Discuss] Description 栋栋有一块长方形的地,他在地上种了一种能量植物,这种植物可以采集太阳光的能量.在这些植物采集能量后,栋栋再使用一个能量汇集机器把这些植物采集到的能量汇集到一起. 栋栋的植物种得非常整齐,一共有n列,每列有m棵,植物的横竖间距都一样,因此对于每一棵植物,栋栋可以

bzoj 2005: [Noi2010]能量采集

1 #include<cstdio> 2 #include<iostream> 3 #define ll long long 4 using namespace std; 5 ll f[100009],n,m,ans; 6 int main() 7 { 8 scanf("%d%d",&n,&m); 9 if(n>m) 10 swap(n,m); 11 for(int i=n;i;i--) 12 { 13 f[i]=(n/i)*(m/i);

BZOJ 2005 NOI2010 能量采集 数论

题目大意:给定n和m,求Σ(1<=i<=n)Σ(1<=j<=m)GCD(i,j)*2-1 i和j的限制不同,传统的线性筛法失效了,这里我们考虑容斥原理 令f[x]为GCD(i,j)=x的数对(i,j)的个数,这个不是很好求 我们令g[x]为存在公因数=x的数对(i,j)的个数(注意不是最大公因数!),显然有g[x]=(n/x)*(m/x) 但是这些数对中有一些的最大公因数为2d,3d,4d,我们要把他们减掉 于是最终f[x]=(n/x)*(m/x)-Σ(2*x<=i*x<

[NOI2010]能量采集

469. [NOI2010]能量采集 ★★☆   输入文件:energy2010.in   输出文件:energy2010.out   简单对比时间限制:1 s   内存限制:512 MB [问题描述] 栋栋有一块长方形的地,他在地上种了一种能量植物,这种植物可以采集太阳光的能量.在这些植物采集能量后,栋栋再使用一个能量汇集机器把这些植物采集到的能量汇集到一起. 栋栋的植物种得非常整齐,一共有n列,每列有m棵,植物的横竖间距都一样,因此对于每一棵植物,栋栋可以用一个坐标(x, y)来表示,其中x

【BZOJ2005】[Noi2010]能量采集 欧拉函数

[BZOJ2005][Noi2010]能量采集 Description 栋栋有一块长方形的地,他在地上种了一种能量植物,这种植物可以采集太阳光的能量.在这些植物采集能量后,栋栋再使用一个能量汇集机器把这些植物采集到的能量汇集到一起. 栋栋的植物种得非常整齐,一共有n列,每列有m棵,植物的横竖间距都一样,因此对于每一棵植物,栋栋可以用一个坐标(x, y)来表示,其中x的范围是1至n,表示是在第x列,y的范围是1至m,表示是在第x列的第y棵. 由于能量汇集机器较大,不便移动,栋栋将它放在了一个角上,

NOI2010能量采集(数论)

没想到NOI竟然还有这种数学题,看来要好好学数论了-- 网上的题解: 完整的结题报告: 首先我们需要知道一个知识,对于坐标系第一象限任意的整点(即横纵坐标均为整数的点)p(n,m),其与原点o(0,0)的连线上除过原点整点的个数为gcd(n,m).其他象限上个数则为gcd(abs(n),abs(m)),这里的gcd(a,b)是指a与b的最大公约数(Greastest Common Divisor),abs(a)是指数a的绝对值.证明:考虑在op上最小的一个整点(x,y),这里的最小是指横纵坐标绝