ZOJ 3870 Team Formation

来源:互联网 发布:windows监控工具 编辑:程序博客网 时间:2024/05/19 21:43

传送门:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3870


已知n个数组,求a^b>max(a,b)这样的组合有多少种


将一个数按二进制写

比如 a=110110,也就是要求满足条件的b有多少。那么只能是某个0变为1,且之前的数不变,所以b的最高位一定是a为0的那位

f[i]表示最高位为i位的数有多少个,累加即可


代码如下:

#include<cstdio>#include<cstring>using namespace std;int T;int n;int ans;int s[100005];int d[40];int bit(int x){for (int i=0;;i++){if (x==(1<<i)){return i;}if (x<(1<<i)){return i-1;}}}int main(){scanf("%d",&T);while (T--){scanf("%d",&n);memset(d,0,sizeof(d));for (int i=1;i<=n;i++){scanf("%d",&s[i]);d[bit(s[i])]++;}ans=0;for (int i=1;i<=n;i++){for (int j=0;j<=bit(s[i]);j++){if ((s[i]&(1<<j))==0){ans+=d[j];}}}printf("%d\n",ans);}}


0 0
原创粉丝点击