SPOJ 25773 BITDIFF

来源:互联网 发布:淘宝cd 编辑:程序博客网 时间:2024/05/24 03:22

Description
给出n个整数a[i],定义两个整数的位差为两个数的二进制表示中对应位不相同的数量,求n个数中任意两个数的位差之和
Input
第一行一整数T表示用例组数,每组用例输入一整数n,之后输入n个整数a[i] (1<=T<=100,1<=n<=10000)
Output
输出n个数中任意两个数的位差之和,结果模10000007
Sample Input
1
4
3 2 1 4
Sample Output
Case 1: 22
Solution
dp[i][0]和dp[i][1]表示第i位是0和1的数的个数,那么sum{ 2*dp[i][0]*dp[i][1] }即为答案
Code

#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>#include<cmath>#include<vector>#include<queue>#include<map>#include<set>#include<ctime>using namespace std;typedef long long ll;#define INF 0x3f3f3f3f#define maxn 11111#define mod 10000007int res=1,T,n,a,dp[44][2];int main(){    scanf("%d",&T);    while(T--)    {        scanf("%d",&n);        memset(dp,0,sizeof(dp));        for(int i=0;i<n;i++)        {            scanf("%d",&a);            for(int j=0;j<40;j++)dp[j][a%2]++,a/=2;        }        ll ans=0;        for(int i=0;i<40;i++)ans=(ans+2ll*dp[i][0]*dp[i][1]%mod)%mod;        printf("Case %d: %d\n",res++,ans);    }    return 0;}
原创粉丝点击