題目描述
兩個整數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...