1. 程式人生 > 其它 >【洛谷】P1447 能量採集

【洛谷】P1447 能量採集

此題雖為紫,但其實在水

能量採集

題目描述

棟棟有一塊長方形的地,他在地上種了一種能量植物,這種植物可以採集太陽光的能量。在這些植物採集能量後,棟棟再使用一個能量彙集機器把這些植物採集到的能量彙集到一起。

棟棟的植物種得非常整齊,一共有 nn 列,每列有 mm 棵,植物的橫豎間距都一樣,因此對於每一棵植物,棟棟可以用一個座標 (x, y)(x,y) 來表示,其中 xx 的範圍是 11 至 nn,yy 的範圍是 11 至 mm,表示是在第 xx 列的第 yy 棵。

由於能量彙集機器較大,不便移動,棟棟將它放在了一個角上,座標正好是 (0, 0)(0,0)。

能量彙集機器在彙集的過程中有一定的能量損失。如果一棵植物與能量彙集機器連線而成的線段上有 kk 棵植物,則能量的損失為 2k + 12k+1。例如,當能量彙集機器收集座標為 (2, 4)(2,4) 的植物時,由於連線線段上存在一棵植物 (1, 2)(1,2),會產生 33 的能量損失。注意,如果一棵植物與能量彙集機器連線的線段上沒有植物,則能量損失為 11。現在要計算總的能量損失。

下面給出了一個能量採集的例子,其中 n = 5n=5,m = 4m=4,一共有 2020 棵植物,在每棵植物上標明瞭能量彙集機器收集它的能量時產生的能量損失。

在這個例子中,總共產生了 3636 的能量損失。

輸入格式

一行兩個整數 n,mn,m。

輸出格式

僅包含一個整數,表示總共產生的能量損失。

輸入

   5 4

輸出

36

輸入

   3 4

輸出

20

過於簡單,就自行看程式碼吧

Code

#include <bits/stdc++.h>
using namespace std;
const int N=100010;
int n,m;long long f[N],ans;
int main(){
    cin>>n>>m;
    if(n>m)
		n^=m^=n^=m; 
    for(int i=n;i;--i){
        f[i]=(long long)(n/i)*(m/i);
        for(int j=i<<1;j<=n;j+=i)
			f[i]-=f[j];
        ans+=((i<<1)-1)*f[i];
    }
    cout<<ans;
	return 0;
}