【hpu oj 1014: 985的数学难题 [思维] 】

来源:互联网 发布:澄海 全知药水 编辑:程序博客网 时间:2024/06/04 18:35

点击打开链接





题解:


/*x^y+x&y==x|y考虑二进制的每一位对结果的影响比如1101、1001、1010进行上述运算则可发现:从右到左每一位上有1的个数记为cnt[0]~cnt[3]分别为2、1、1、3因为或运算除了0|0==0其余都为1也就是0|1+1|1.依次看二进制末尾有多少数贡献了1,再根据位运算的性质进行计数即可。*/#include<cstdio>#include<cstring>#include<algorithm>#define M 100009using namespace std;int a[M];int cmp(int A,int B){return A>B;}int main(){int t,i,n;while(~scanf("%d",&t)){while(t--){long long sum=0;scanf("%d",&n);for(i=1;i<=n;i++){scanf("%d",&a[i]);sum+=a[i];}sum*=(n-1);sort(a+1,a+n+1,cmp);long long m=1,ans;while(a[1]){ans=0;for(i=1;i<=n;i++){if(a[i]==0)break;if(a[i]&1)ans++;a[i]>>=1;}sum+=(ans*(n-ans)+(ans-1)*ans/2)*m*2;m<<=1;}printf("%lld\n",sum);}}return 0;}



原创粉丝点击