【洛谷】P1447 能量採集
阿新 • • 發佈:2022-03-08
此題雖為紫,但其實在水
題目描述
棟棟有一塊長方形的地,他在地上種了一種能量植物,這種植物可以採集太陽光的能量。在這些植物採集能量後,棟棟再使用一個能量彙集機器把這些植物採集到的能量彙集到一起。
棟棟的植物種得非常整齊,一共有 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; }