bzoj2005: [Noi2010]能量采集

【题意】

  一块n*m大小的田,人站在(0,0)位置。对于每个(i,j)位置的植物,从(0,0)到(i,j)的连线中有k棵植物,能量损失就为2*k-1(包括端点上的植物)。求所有植物的能量损失。

  n,m<=10^5

【题解】

  实际上对于每棵植物k就是x坐标,y坐标的公约数,不过n*m棵植物显然不能一个个公约数求过来。

  仔细想一下最大公约数d<=min(n,m),所以我们考虑枚举d并计算一下最大公约数为d的数对个数,这个值就设为f(d)好了。

  首先直接(n/d)*(m/d)计算出来的只是公约数包含d的数对,所以减去最大公约数为2*d,3*d……的数对个数。

  f(d)=(n/d)*(m/d)-[f(2*d)+f(3*d)+……+f(min(n,m)/d*d)],这个f(d)就倒着递推一遍就行了。

【代码】

 1 #include <cstdio>
 2 #include <iostream>
 3 #define ll long long
 4 using namespace std;
 5 int l,n,m;
 6 ll ans,f[100100];
 7 int main()
 8 {
 9     cin>>n>>m;
10     l=n>m?m:n;
11     for (int i=l;i;--i)
12     {
13         f[i]=(ll)(n/i)*(m/i);
14         for (int j=i+i;j<=l;j+=i)
15             f[i]-=f[j];
16         ans=ans+f[i]*(2*i-1);
17     }
18     cout<<ans<<endl;
19     return 0;
20 }

时间: 2024-10-14 22:46:53

bzoj2005: [Noi2010]能量采集的相关文章

BZOJ2005: [Noi2010]能量采集 莫比乌斯反演的另一种方法——nlogn筛

分析:http://www.cnblogs.com/huhuuu/archive/2011/11/25/2263803.html 注:从这个题收获了两点 1,第一象限(x,y)到(0,0)的线段上整点的个数是gcd(x,y) 2,新学了一发求gcd(x,y)=k有多少对的姿势,已知0<x<=n,0<y<=m 令x=min(n,m),令f[i]代表gcd(x,y)=i的对数, 那么通过O(xlogx)的复杂度就可以得到f[1]到f[n](反着循环) 普通的容斥(即莫比乌斯反演)其实也

【莫比乌斯反演】【线性筛】bzoj2005 [Noi2010]能量采集

http://blog.csdn.net/Clove_unique/article/details/51089272 Key:1.连接平面上某个整点(a,b)到原点的线段上有gcd(a,b)个整点. 2.欧拉函数的性质之一:若(N%a==0 && (N/a)%a==0) 则有:phi(N)=phi(N/a)*a.由此可以线性筛. 3.一个数的所有因子的phi值之和恰好等于这个数本身. #include<cstdio> #include<algorithm> usin

【莫比乌斯反演】BZOJ2005 [NOI2010]能量采集

Description 求sigma gcd(x,y)*2-1,1<=x<=n, 1<=y<=m.n, m<=1e5. Solution f(n)为gcd正好是n的(x,y)的个数 F(n)为gcd是n的倍数的(x,y)的个数 我们要求的就是f(i) 然而这个不好直接算,可F(i)可以直接用(n/i)*(m/i)得到 那么有F(n)=sigma n|i f(i) 于是有f(n)=sigma n|i mu(i)*F(i) 这就是莫比乌斯反演,不过这道题直接用容斥的思想想也很容易

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

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

[NOI2010]能量采集

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

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

2005: [Noi2010]能量采集

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

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),这里的最小是指横纵坐标绝

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

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