本文主要是介绍CodeForces - 272B Dima and Sequence 函数/思维,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Dima and Sequence
time limit per test2 seconds
memory limit per test256 megabytes
inputstandard input
outputstandard output
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.
Examples
input
3
1 2 4
output
3
input
3
5 3 1
output
1
Note
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.
题意理解:本题的意思是给出一个函数,满足三个条件:f(0)=0;
f(x)=f(2x);f(2x+1)=f(x)+1;我觉得解题思路在于观察规律;
由递推可知f(1)=f(2)=f(4)=f(8)……=1;本来打算打表;后来才发现规律找错了……此题要解决的话要从后向前推出所有函数值,找出函数值相同的数,通过排列组合从中选出一对就是答案
#include<iostream>
#include<cstdio>
using namespace std;
long long f[40]={0};//数组要设大一点
int main()
{int n;scanf("%d",&n);while(n--){ int sum=0;//意思是当x为当前值时的函数值int x;scanf("%d",&x);while(x){if(x&1)//如果x是奇数,则函数值+1,一直往前递推,最后可以得出f(x)的“祖先”{sum++;x=(x-1)/2;}else x/=2;//如果是偶数则不变}f[sum]++;//函数值位sum的x有几个}long long ans=0;for(int i=0;i<40;i++)ans+=f[i]*(f[i]-1)/2;//选对数printf("%I64d\n",ans);return 0;
}
这篇关于CodeForces - 272B Dima and Sequence 函数/思维的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!