【题目链接】click here~~
【题目大意】给你一些数,每次选两个数a,b如果a,b的异或值大于a和b,则满足条件,求有多少种满足的
【解题思路】:数位DP+二分了,先把队友代码弱弱贴上(其实这到题翻译之后,全程我在打酱油,没有思路)明天好好研究~~
代码:
#include<stdio.h> #include<string> #include<string.h> #include<math.h> #include<iostream> #include<algorithm> using namespace std; int a[100005]; int n; int shuru() { int b; bool fushu=0; char ch; while(!((ch=getchar())>='0'&&ch<='9')) { if(ch=='-') { fushu=1; ch=getchar(); break; } } b=(ch-'0'); while((ch=getchar())>='0' && ch<='9') b=b*10+(ch-'0'); return fushu? -b : b; } int jiao1[100],jiao2[100]; int main() { // freopen("in.txt","r",stdin); int T; scanf("%d",&T); while(T--) { int n; scanf("%d",&n); for(int i=0; i<n; i++) a[i] = shuru(); sort(a,a+n); long long sum=0; for(int i=0; i<=32; i++) { long long p=(long long) pow(2,i); jiao1[i]=lower_bound(a,a+n,p)-a; } for(int i=0; i<=32; i++) { long long p=(long long) pow(2,i); jiao2[i]=upper_bound(a,a+n,p-1)-a; } for(int i=n-1; i>=1; i--) { int top=0; int ans[40]; int xx=a[i]; while(xx) { ans[top++]=xx%2; xx/=2; } for(int j=top-1; j>=0; j--) { if(!ans[j]) { // printf("!%d!\n",a[i]); int r=jiao2[j+1]; r-=1; int l=jiao1[j]; sum+=r-l+1; // printf("%d %d\n",l,r); } } } printf("%lld\n",sum); } }