2013 - ECJTU 暑期训练赛第四场-problem-B

来源:互联网 发布:华为p9优化 编辑:程序博客网 时间:2024/06/10 16:51
B -B
Crawling in process...Crawling failedTime Limit:2000MS    Memory Limit:262144KB     64bit IO Format:%I64d & %I64u
SubmitStatus Practice CodeForces 272B

Description

Dima got into number sequences. Now he's got sequencea1, a2, ..., an, consisting ofn positive integers. Also, Dima has got a functionf(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 thatf(ai) = f(aj). Help him, count the number of such pairs.

Input

The first line contains integern (1 ≤ n ≤ 105). The second line containsn 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 inC++. It is preferred to use the cin, cout streams or the %I64d specifier.

Sample Input

Input
31 2 4
Output
3
Input
35 3 1
Output
1

Sample Output

21630
 

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;elses[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);}


原创粉丝点击