博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
P1447 [NOI2010] 能量采集
阅读量:2153 次
发布时间:2019-04-30

本文共 3218 字,大约阅读时间需要 10 分钟。

题目描述

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

栋栋的植物种得非常整齐,一共有 n 列,每列有 m 棵,植物的横竖间距都一样,因此对于每一棵植物,栋栋可以用一个坐标 (x, y) 来表示,其中 x 的范围是 1 至 n,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 % 10\% 10% 的数据: n , m ≤ 10 n, m \leq 10 n,m10

对于 50 % 50\% 50% 的数据: n , m ≤ 100 n, m \leq 100 n,m100
对于 80 % 80\% 80% 的数据: n , m ≤ 1 0 3 n, m \leq 10^3 n,m103
对于 90 % 90\% 90% 的数据: n , m ≤ 1 0 4 n, m \leq 10^4 n,m104
对于 100 % 100\% 100% 的数据: 1 ≤ n , m ≤ 1 0 5 1 \leq n, m \leq 10^5 1n,m105


题解

可以发现一个规律:点 ( x , y ) (x,y) (x,y)的能量损失 = 2 gcd ⁡ ( x , y ) − 1 =2\gcd(x,y)-1 =2gcd(x,y)1

∴ 题 目 为 : ∑ i = 1 n ∑ j = 1 m ( 2 gcd ⁡ ( i , j ) − 1 ) \therefore 题目为:\sum_{i=1}^n\sum_{j=1}^m(2\gcd(i,j)-1) i=1nj=1m(2gcd(i,j)1)

∴    2 ∑ i = 1 n ∑ j = 1 m ( gcd ⁡ ( i , j ) ) − n m \therefore \;2\sum_{i=1}^n\sum_{j=1}^m(\gcd(i,j))-nm 2i=1nj=1m(gcd(i,j))nm

∴ 重 点 解 决 ∑ i = 1 n ∑ j = 1 m ( gcd ⁡ ( i , j ) ) : \therefore 重点解决\sum_{i=1}^n\sum_{j=1}^m(\gcd(i,j)): i=1nj=1m(gcd(i,j))

∵ ∑ d ∣ n ϕ ( d ) = n , d ∣ gcd ⁡ ( i , j ) 满 足 d ∣ i 且 d ∣ j \because \sum_{d∣n}ϕ(d) = n,d|\gcd(i,j)满足d|i且d|j dnϕ(d)=ndgcd(i,j)didj

∴ ∑ d ∣ i    &    d ∣ j ϕ ( d ) = gcd ⁡ ( i , j ) \therefore \sum_{d∣i\;\&\;d|j}ϕ(d)=\gcd(i,j) di&djϕ(d)=gcd(i,j)

∴ ∑ i = 1 n ∑ j = 1 m ( gcd ⁡ ( i , j ) ) \therefore \sum_{i=1}^n\sum_{j=1}^m(\gcd(i,j)) i=1nj=1m(gcd(i,j))

= ∑ i = 1 n ∑ j = 1 m ∑ d ∣ i    &    d ∣ j ϕ ( d ) =\sum_{i=1}^n\sum_{j=1}^m\sum_{d∣i\;\&\;d|j}ϕ(d) =i=1nj=1mdi&djϕ(d)

= ∑ d = 1 n ∑ i = 1 n ∑ j = 1 m    [    d ∣ i    &    d ∣ j    ]    ϕ ( d ) =\sum_{d=1}^n\sum_{i=1}^n\sum_{j=1}^m\;[\;d|i\;\&\;d|j\;]\;ϕ(d) =d=1ni=1nj=1m[di&dj]ϕ(d)

= ∑ d = 1 n ∑ d ∣ i n ∑ d ∣ j m ϕ ( d ) =\sum_{d=1}^n\sum_{d|i}^n\sum_{d|j}^mϕ(d) =d=1ndindjmϕ(d)

因为 ∑ d ∣ i n ∑ d ∣ j m \sum_{d|i}^n\sum_{d|j}^m dindjm枚举的是 d d d 的倍数 i i i j j j,而1~n中 d d d 的倍数有 ⌊ d n ⌋ ⌊\frac{d}{n}⌋ nd个,

所以上式中的 i i i j j j 的贡献分别是 ⌊ d n ⌋ ⌊\frac{d}{n}⌋ nd ⌊ d m ⌋ ⌊\frac{d}{m}⌋ md

所以式子变为 ∑ d = 1 n (    ⌊ d n ⌋    ⌊ d m ⌋    ϕ ( d )    ) \sum_{d=1}^n(\;⌊\frac{d}{n}⌋\;⌊\frac{d}{m}⌋\;ϕ(d)\;) d=1n(ndmdϕ(d))

该题答案即为 2 ∑ d = 1 n (    ⌊ d n ⌋    ⌊ d m ⌋    ϕ ( d )    ) − n m 2\sum_{d=1}^n(\;⌊\frac{d}{n}⌋\;⌊\frac{d}{m}⌋\;ϕ(d)\;)-nm 2d=1n(ndmdϕ(d))nm

式子推出来了,再用就可O(n)解决该题了~~~

#include
#include
#define Max 1000001using namespace std;long long phi[Max],n,m,p[Max],pn,ans;bool f[Max];void Phi(){
phi[1]=1; for(int i=2;i<=n;i++) {
if(!f[i]) {
p[++pn]=i; phi[i]=i-1; } for(int j=1;j<=pn&&i*p[j]<=n;j++) {
f[i*p[j]]=1; if(i%p[j]==0) {
phi[i*p[j]]=phi[i]*p[j]; break; } else phi[i*p[j]]=phi[i]*(p[j]-1); } }}int main(){
scanf("%lld%lld",&n,&m); if(n>m) swap(n,m); Phi(); for(int d=1;d<=n;d++) ans+=phi[d]*(n/d)*(m/d); printf("%lld",(ans<<1)-n*m);}

转载地址:http://ihpwb.baihongyu.com/

你可能感兴趣的文章
c结构体、c++结构体和c++类的区别以及错误纠正
查看>>
Linux下查看根目录各文件内存占用情况
查看>>
A星算法详解(个人认为最详细,最通俗易懂的一个版本)
查看>>
利用栈实现DFS
查看>>
逆序对的数量(递归+归并思想)
查看>>
数的范围(二分查找上下界)
查看>>
算法导论阅读顺序
查看>>
Windows程序设计:直线绘制
查看>>
linux之CentOS下文件解压方式
查看>>
Django字段的创建并连接MYSQL
查看>>
div标签布局的使用
查看>>
HTML中表格的使用
查看>>
(模板 重要)Tarjan算法解决LCA问题(PAT 1151 LCA in a Binary Tree)
查看>>
(PAT 1154) Vertex Coloring (图的广度优先遍历)
查看>>
(PAT 1115) Counting Nodes in a BST (二叉查找树-统计指定层元素个数)
查看>>
(PAT 1143) Lowest Common Ancestor (二叉查找树的LCA)
查看>>
(PAT 1061) Dating (字符串处理)
查看>>
(PAT 1118) Birds in Forest (并查集)
查看>>
数据结构 拓扑排序
查看>>
(PAT 1040) Longest Symmetric String (DP-最长回文子串)
查看>>