問題 C 數對

2022-04-08 14:55:26 字數 1434 閱讀 6342

題目描述

兩個整數a,b,如果他們某⼀數字相同了,那麼(a,b)就是⼀組合法的數對(沒有順序),現在給定了n個整數,問存在多少對合法的數對呢?

輸入第⼀⾏,⼀個整數n。

接下來n⾏,每⾏⼀個正整數。

輸出輸出⼀個整數,表示合法數對個數。

樣例輸入

複製樣例資料312

12樣例輸出2提示

對於100%的資料,n≤1000000,每個正整數≤1018。

兩個數能夠成為合法的數對, 那麼按照題目意思肯定是含有相同的數字, 這個數字肯定是0-9裡面的,可能含有多個, 但是含有乙個相同的, 和含有多個相同的,沒有區別,或者說對他倆成為一對沒有影響,因為這兩個情況都能夠是這兩個數成為合法的數對, 那麼怎麼表示呢,怎麼表示他倆含有相同的數字,這個時候就用到二進位制了, 眾所周知,如果1 << x == 1 , 那麼這個公式可以用來表示第x位存在 , 在這個題目裡可以用來表示該數含有該數字,再加上含有多個相同的數字和含有乙個相同的數字效果相同, 那麼我們就是1 << 10 ,這個範圍來表示該數字含有哪些數字,比如110101 , 含有0 , 2 , 4 , 5 , 如果該數字裡面還有個2, 則不影響該二進位制數的值,只要 p |= 1 << (a % 10) , 就是該二進位制與上乙個尾數所表達的內容,並用num[p] ++ 記錄一下這種數字的個數

最後我們就暴力列舉這1 << 10 , 個數, n ^ 2 複雜度,不會超時 ,i , j <= 1 << 10 , 如果i == j了, 那麼就表示這個i所代表的數字有num[i] 個, 兩兩配對, 就是num[i] * (num[i] - 1) , 這個含有重複的,最後除以2 , 如果i & j 存在, 那麼就表示這兩個含有相同的數字, 那麼我們就是直接加上num[i] * num[j] , , 這個也有重複的,最後結果除以2 ,

#include 

#include

#include

using namespace std;

typedef long

long ll ;

ll num[

11200];

intmain()

num[p]++;

} ll m =

1<<

10;

ll ans =0;

for(

int i =

1;i <= m ;i ++

)for

(int j =

1;j <= m ;j ++)if

(i == j)

ans += num[i]

*(num[i]-1

);else

if(i & j)

ans += num[i]

* num[j]

;printf

("%lld\n"

, ans /2)

;return0;

}

問題 C 數對

題目描述 兩個整數a,b,如果他們某 數字相同了,那麼 a,b 就是 組合法的數對 沒有順序 現在給定了n個整數,問存在多少對合法的數對呢?輸入 第 個整數n。接下來n 每 個正整數。輸出 輸出 個整數,表示合法數對個數。樣例輸入 複製樣例資料312 12樣例輸出 2提示 對於100 的資料,n 1...

問題 D 相鄰數對問題

題目描述 給定n個不同的整數,問這些數中有多少對整數,它們的值正好相差1。評測用例規模與約定 1 n 1000,給定的整數為不超過10000的非負整數。輸入 輸入的第一行包含乙個整數n,表示給定整數的個數。第二行包含所給定的n個整數。輸出 輸出乙個整數,表示值正好相差1的數對的個數。樣例輸入 6 1...

18727 數對問題一

description 乙個長度為n的正整數序列,現在需要計算出有多少對數字的差的絕對值為c。注意只要位置不同就認為是不相同的數對。輸入格式 第一行,兩個整數 n,c。1 輸出格式 僅一行,滿足條件的數對的個數。輸入樣例 4 11 2 3 1 輸出樣例3提示 a1,a2 a2,a3 a2,a4 共3...