給你n個數 問有多少種情況 兩兩異或大於兩個數中的最大值;
分析 如果a小於b 及大的為b 要想a^b大於b 及a的最高位(一定為1)與b的對應位不一樣 及b的對應位為0 就一定滿足 這樣就轉換為小的數的對應位
先排序 mark【i】表示i這個位置為0的數的個數
#include#include #include #include using namespace std; int num[100010]; int cmp(int a,int b) { return a>b; } int main() { int T,i,j,n; scanf("%d",&T); while(T--) { scanf("%d",&n); for(i=1;i<=n;i++) { scanf("%d",&num[i]); } sort(num+1,num+1+n,cmp); int record[100],mark[100]; memset(record,0,sizeof(record)); int ans=0; for(i=1;i<=n;i++) { j=1; int x=num[i]; while(x) { mark[j++]=x%2; x/=2; } ans+=record[j-1]; for(int k=1;k