小Hi和小Ho的禮物

2021-09-27 03:26:27 字數 1723 閱讀 3338

某人有n袋金幣,其中第i袋內金幣的數量是ai。現在他決定選出2袋金幣送給小hi,再選2袋金幣送給小ho,同時使得小hi和小ho得到的金幣總數相等。他想知道一共有多少種不同的選擇方法。

具體來說,有多少種下標四元組(i, j, p, q)滿足i, j, p, q兩兩不同,並且i < j, p < q, ai+ aj = ap + aq。  

例如對於陣列a=[1, 1, 2, 2, 2],一共有12種選法:

i j p q

1 3 2 4

1 3 2 5

1 4 2 3

1 4 2 5

1 5 2 3

1 5 2 4

2 3 1 4

2 3 1 5

2 4 1 3

2 4 1 5

2 5 1 3

2 5 1 4

input

第一行包含乙個整數n。  

第二行包含n個整數,a1, a2, a3 ... an。

對於70%的資料,1 <= n <= 100  

對於100%的資料,1 <= n <= 1000, 1 <= ai <= 1000000

output

不同選擇的數目。

sample input

5  

1 1 2 2 2

sample output

12
思路:

1. 預處理2袋金幣的和和某個值x一共有多少種選法,將預處理的結果存在雜湊表中

2. 一袋金幣不能即給小hi又給ho.

方法:第一袋的選法數目等於有幾個袋子的金幣與第三袋一樣

舉例:情況1

a[1,1,2,2,2]

i   j   為下標

1   3

1   4

1   5

2   3

//     2   4     選這兩種

//     2   5

假設小hi為下標 1,3

情況2:

a[2,2,2,2,2]

i   j

1   2  

1   3

1   4

1   5

2   3

2   4

2   5

//     3   4     選這三種

//     3   5

//     4   5

假設小hi為下標 1,2

所以我們預處理cnt1[x]表示包含x枚金幣的袋子數

#include #include #include using namespace std;

const int n = 2000000 + 20;

int a[n],b[n],c[n];

int n;

int main()

for(int i = 0; i < n; i++)

} long long ans = 0;

for(int i = 0; i < n; i++)

else

ans += c[a[i] + a[j]] - b[a[i]] * b[a[j]] + (b[a[i]] - 1) * (b[a[j]] - 1); //推導出來的公式

}} cout << ans << endl;

} return 0;

}

小Hi和小Ho的禮物

某人有n袋金幣,其中第i袋內金幣的數量是ai。現在他決定選出2袋金幣送給小hi,再選2袋金幣送給小ho,同時使得小hi和小ho得到的金幣總數相等。他想知道一共有多少種不同的選擇方法。具體來說,有多少種下標四元組 i,j,p,q 滿足i,j,p,q兩兩不同,並且i j,p q,ai aj ap aq。...

hiho1505 小Hi和小Ho的禮物描述

小hi和小ho的禮物 描述某人有n袋金幣,其中第i袋內金幣的數量是ai。現在他決定選出2袋金幣送給小hi,再選2袋金幣送給小ho,同時使得小hi和小ho得到的金幣總數相等。他想知道一共有多少種不同的選擇方法。具體來說,有多少種下標四元組 i,j,p,q 滿足i,j,p,q兩兩不同,並且i j,p q...

hihoCoder 1606 小Hi和小Ho的密碼

時間限制 10000ms 單點時限 1000ms 記憶體限制 256mb 描述小hi和小ho一直使用加密的方式傳輸訊息。他們使用如下方法來生成一組密碼 首先小hi和小ho選擇乙個整數 n pk 其中p質數 k是正整數,也即n是質數或質數的冪 其次,他們會求出兩個整數a和b滿足0 a b n,並且,n...