ZOJ-3870
题目大意:
给出一组序列如 1 2 3 4 5
找出a^b > max(a,b)的 ab组合的个数
分析:
对于任意的a(以下用二进制来表示)
如a
1011001
对应的b可以是
1*****
1**
1*
对于b
若b的最高位 对于 a来说 在a的当前位 为0 则符合上述条件
AC代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=1e5+5;
int a[maxn],cnt[33];
int main(){
int T;
scanf("%d",&T);
while(T--){
int ans=0;
memset(cnt,0,sizeof(cnt));
int n,x,bitnum;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&x);
a[i]=x;
bitnum=0;
while(x){//计算x的二进制位数
x>>=1;
bitnum++;
}
cnt[bitnum]++;//cnt数组用来存放bitnum位的数字的数量
}
for(int i=0;i<n;i++){//遍历每一个数
bitnum=1;
while(a[i]){
if( (a[i]&1)==0 )//如果此时的a[i]从右向左 末位为0
ans+=cnt[bitnum];//就把以bitnum位为最高位的数字的个数全部加上
a[i]>>=1;
bitnum++;
}
}
printf("%d\n",ans);
}
return 0;
}