985的数学难题

mac2022-06-30  64

Time Limit: 2 Sec  Memory Limit: 128 MBSubmit: 153  Solved: 35SubmitStatusWeb Board

Description

985有n个正整数,他想快速知道下面函数的返回值   int a[N+1]; long long Solve() {     int i, j;     long long ans = 0;     for(i = 1; i <= N; i++) {      for(int j = i + 1; j <= N; j++) {     ans += a[i] + a[j] + (a[i] ^ a[j]) + (a[i] | a[j]) + (a[i] & a[j]); }     }     return ans; }   注:^表示异或运算。

 

Input

第一行输入一个整数t,代表有t组测试数据。 每组数据第一行输入一个整数代表元素个数,接下来一行输入n个正整数a[]。 注:1 <= t <= 30,1 <= n,a[] <= 100000。  

 

Output

一个整数代表最后的返回值ans。

 

Sample Input

2 1 10 2 1 1

Sample Output

0 4 1 #include<cstdio> 2 #include<string.h> 3 #include<algorithm> 4 using namespace std; 5 #define INF 0xfffffff 6 long long n,ans; 7 long long num[100000+11]; 8 bool cmp(int a,int b) 9 { 10 return a>b; 11 } 12 int main() 13 { 14 int i,T; 15 scanf("%d",&T); 16 while(T--) 17 { 18 scanf("%lld",&n); 19 ans=0; 20 for(i=1;i<=n;i++) 21 { 22 scanf("%d",&num[i]); 23 ans+=num[i]; 24 } 25 ans*=(n-1); 26 sort(num+1,num+n+1,cmp); 27 long long mul=1,ant; 28 while(num[1]) 29 { 30 ant=0; 31 for(i=1;i<=n;i++) 32 { 33 if(num[i]&1) //计算从右往左每一位上,n个数字1和个数 34 ant++; 35 num[i]>>=1; 36 } 37 ans+=2*(((n-ant)*ant+(((ant-1)*ant)>>1))*mul);/* a|b=a^b+a&b;所以二倍或;也可分别求出异或和与 38 ans+=(((ant-1)*ant)>>1)*mul; 与运算,所有的这位数为1的数相结合 39 ans+=((n-ant)*ant)*mul;异或运算,这一位为0的和这一位为1的相结合 */ 40 mul<<=1;//二进制转为十进制的时候需要*2的n次方、 41 } 42 printf("%lld\n",ans); 43 } 44 return 0; 45 } View Code

 

转载于:https://www.cnblogs.com/llal/p/5753935.html

最新回复(0)