Description
Dima got into number sequences. Now he's got sequence a1, a2, ..., an, consisting of n positive integers. Also, Dima has got a function f(x), which can be defined with the following recurrence:
- f(0) = 0;
- f(2·x) = f(x);
- f(2·x + 1) = f(x) + 1.
Dima wonders, how many pairs of indexes (i, j) (1 ≤ i < j ≤ n) are there, such that f(ai) = f(aj). Help him, count the number of such pairs.
Input
The first line contains integer n (1 ≤ n ≤ 105). The second line contains n positive integers a1, a2, ..., an (1 ≤ ai ≤ 109).
The numbers in the lines are separated by single spaces.
Output
In a single line print the answer to the problem.
Please, don't use the %lld specifier to read or write 64-bit integers in C++. It is preferred to use the cin, cout streams or the %I64d specifier.
Sample Input
3
1 2 4
3
3
5 3 1
1
Sample Output
216 30
Hint
In the first sample any pair (i, j) will do, so the answer is 3.
In the second sample only pair (1, 2) will do.
这题要递归,并用map函数迭代查找相同
AC代码:
#include<iostream>
#include<cstdio>
#include<map>
const int MAX=1000001;
int s[MAX];
int k[MAX];
using namespace std;
int main()
{
__int64 m,i,j,sum,b,c;
int sousuo(int x);
s[0]=0;
for(i=1;i<MAX;i++)
{
if(i%2!=0)
s[i]=s[i/2]+1;
else
s[i]=s[i/2];
}
int n;
while(cin>>n)
{
map<int,int>MAP;
sum=0;
for(i=0;i<n;i++)
{
cin>>k[i];
sum+=MAP[sousuo(k[i])]++;
}
cout<<sum<<endl;
}
return 0;
}
int sousuo(int x)
{
if(x<MAX)
{
return s[x];
}
return sousuo(x/2)+(x%2==0?0:1);
}