题目描述

求(x,y)的对数满足x∈[0,a],y∈[0,b],x⊕y=0且|x-y|<=m

题解

一种比较sb的做法是考虑x-y的借位,根据借位以及差值进行转移

还有一种比较正常的做法,假设一开始x=0,y=n,那么就需要把y的某一些1移到x上,也就是对于(x-y)加上2^(i+1)

设加的数之和为s,那么需要保证|s-n|<=m,也就是n-m<=s<=n+m

注意是当n的第i位为1时才可以加上2^(i+1),把上界右移一位后就变成加上2^i

设f[i][0/1][0/1][0/1],表示当前到第i位,x、y、s是否顶住上界

枚举第i位的xy所选,使得x[i]^y[i]=n[i]且新的s不会越界即可

code

sb版

#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#define fo(a,b,c) for (a=b; a<=c; a++)
#define fd(a,b,c) for (a=b; a>=c; a--)
#define min(a,b) (a<b?a:b)
using namespace std; int a[60];
int b[60];
int x[60];
int y[60];
long long f[61][2][2][2][2];
int T,i,j,k,l,I,J,K,L,p,q,P,Q,fs,ll;
long long n,m,A,B,ans; int swap(int &x,int &y)
{
int z=x;
x=y;
y=z;
} void work()
{
memset(f,0,sizeof(f));
f[60][0][0][0][0]=1;
fd(i,60,1)
{
I=i-1; fo(j,0,1)
{
fo(k,0,1)
{
fo(p,0,1)
{
fo(q,0,1)
if (f[i][j][k][p][q])
{
if (!a[I])
{
if (j && !b[I]) continue; fo(l,0,1)
if ((p || x[I]>=l) && (q || y[I]>=l))
{
if (!j && b[I]>0) K=1; else K=k;
if (x[I]>l) P=1; else P=p;
if (y[I]>l) Q=1; else Q=q; f[I][j][K][P][Q]+=f[i][j][k][p][q];
}
}
else
{
if (I==fs) ll=1;
else ll=0; fo(l,ll,1)
if ((p || x[I]>=l) && (q || y[I]>=(1-l)))
{
if (!l)
{
if (!j)
J=0,K=1;
else
{
if (b[I])
J=0,K=k;
else
J=1,K=k;
}
}
else
{
if (j && !b[I]) continue; if (k)
J=0,K=1;
else
{
if (!b[I])
{
if (j)
continue;
else
J=1,K=0;
}
else
{
if (j)
continue;
else
J=0,K=0;
}
}
}
if (x[I]>l) P=1; else P=p;
if (y[I]>(1-l)) Q=1; else Q=q; f[I][J][K][P][Q]+=f[i][j][k][p][q];
}
}
}
}
}
}
} fo(k,0,1)
{
fo(p,0,1)
{
fo(q,0,1)
ans+=f[0][0][k][p][q];
}
}
} int main()
{
scanf("%d",&T);
for (;T;--T)
{
scanf("%lld%lld%lld%lld",&A,&B,&n,&m); fs=-1; fo(i,0,59)
{
a[i]=n&1;
n>>=1; if (a[i])
fs=i;
} if (fs==-1)
{
printf("%lld\n",min(A,B)+1);
continue;
} fo(i,0,59) b[i]=m&1,m>>=1;
fo(i,0,59) x[i]=A&1,A>>=1;
fo(i,0,59) y[i]=B&1,B>>=1; ans=0;
work(); fo(i,0,59)
swap(x[i],y[i]); work(); printf("%lld\n",ans);
}
}

正常版

#include <bits/stdc++.h>
#define fo(a,b,c) for (a=b; a<=c; a++)
#define fd(a,b,c) for (a=b; a>=c; a--)
#define min(a,b) (a<b?a:b)
#define max(a,b) (a>b?a:b)
using namespace std; int a[61];
int x[61];
int y[61];
int z[61];
long long f[61][2][2][2];
int T,i,j,k,l,I,J,K,L,s,S,X,Y,X2,Y2;
long long N,M,A,B,s1; void turn(int *a,long long s)
{
int i; fo(i,1,60)
a[i]=s%2,s/=2;
} long long work(long long t)
{
long long ans=0; if (t>=0)
{
t/=2;
turn(a,t);
}
else
return 0; memset(f,0,sizeof(f));
f[60][0][0][0]=1; fd(i,60,1)
{
I=i-1; fo(j,0,1)
{
fo(k,0,1)
{
fo(l,0,1)
if (f[i][j][k][l])
{
if (j) X2=1; else X2=x[i];
if (k) Y2=1; else Y2=y[i]; fo(X,0,X2)
{
if (X<x[i]) J=1; else J=j; fo(Y,0,Y2)
if ((X^Y)==z[i] && !(!l && X && !Y && !a[i]))
{
if (Y<y[i]) K=1; else K=k;
if ((X && !Y)<a[i]) L=1; else L=l; f[I][J][K][L]+=f[i][j][k][l];
}
}
}
}
}
} fo(j,0,1)
{
fo(k,0,1)
{
fo(l,0,1)
ans+=f[0][j][k][l];
}
} return ans;
} int main()
{
scanf("%d",&T);
for (;T;--T)
{
scanf("%lld%lld%lld%lld",&A,&B,&N,&M);
turn(x,A);
turn(y,B);
turn(z,N); printf("%lld\n",work(N+M)-work(N-M-1));
}
}

Comet OJ - Contest #12 D的更多相关文章

  1. Comet OJ - Contest #12

    B 整个表格其实是一些联通块,取反操作不能跨连通块.所以直接统计一下每个连通块内数字不对的个数是不是偶数即可 #include<iostream> #include<cstring& ...

  2. Comet OJ - Contest #2 简要题解

    Comet OJ - Contest #2 简要题解 cometoj A 模拟,复杂度是对数级的. code B 易知\(p\in[l,r]\),且最终的利润关于\(p\)的表达式为\(\frac{( ...

  3. Comet OJ - Contest #2简要题解

    Comet OJ - Contest #2简要题解 前言: 我没有小裙子,我太菜了. A 因自过去而至的残响起舞 https://www.cometoj.com/contest/37/problem/ ...

  4. Comet OJ - Contest #4--前缀和

    原题:Comet OJ - Contest #4-B https://www.cometoj.com/contest/39/problem/B?problem_id=1577传送门 一开始就想着暴力打 ...

  5. Comet OJ - Contest #11 题解&赛后总结

    Solution of Comet OJ - Contest #11 A.eon -Problem designed by Starria- 在模 10 意义下,答案变为最大数的最低位(即原数数位的最 ...

  6. Comet OJ - Contest #8

    Comet OJ - Contest #8 传送门 A.杀手皇后 签到. Code #include <bits/stdc++.h> using namespace std; typede ...

  7. Comet OJ - Contest #13-C2

    Comet OJ - Contest #13-C2 C2-佛御石之钵 -不碎的意志-」(困难版) 又是一道并查集.最近做过的并查集的题貌似蛮多的. 思路 首先考虑,每次处理矩形只考虑从0变成1的点.这 ...

  8. Comet OJ - Contest #13 「火鼠的皮衣 -不焦躁的内心-」

    来源:Comet OJ - Contest #13 芝士相关: 复平面在信息学奥赛中的应用[雾 其实是道 sb 题??? 发现原式貌似十分可二项式定理,然后发现确实如此 我们把 \(a^i\) 替换成 ...

  9. Comet OJ - Contest #13 「佛御石之钵 -不碎的意志-」(hard)

    来源:Comet OJ - Contest #13 一眼并查集,然后发现这题 tmd 要卡常数的说卧槽... 发现这里又要用并查集跳过访问点,又要用并查集维护联通块,于是开俩并查集分别维护就好了 一开 ...

随机推荐

  1. Python基础知识思维导图|自学Python指南

    微信公众号[软件测试大本营]回复"python",获取50本python精华电子书. 测试/开发知识干货,互联网职场,程序员成长崛起,终身学习. 现在最火的编程语言是什么?答案就是 ...

  2. C++随笔(0)——关于const

    最近发现自己对const这一块其实不甚熟悉,所以复习一下const的相关知识点. 基本用法 const int bufSize = 512; 上面这样就可以将bufSize定义为常量,编译的时候编译器 ...

  3. shell脚本4

    1.从FTP服务器下载文件 #!/bin/bash if [ $# -ne 1 ]; then echo "Usage: $0 filename" fi dir=$(dirname ...

  4. Centos7的引导顺序

    1.UEFI或BIOS初始化,运行POST开机自检(Power   On  Self   Test) 2.选择启动设备 3.引导装载程序grub2 4.加载装载程序的配置文件:/etc/grub.d/ ...

  5. 【生成树趣题】CF723F st-Spanning Tree

    题目传送门 题意: 给定一个n个点m条边的无向联通图,没有重边和自环.给定s和t,求一棵生成树,使得s,t的度数不超过ds,dt.若有解,输出“Yes”和方案(多组方案输出任意一组),若无解,输出“N ...

  6. Centos7单机安装Tableau2018.2

    cd先将服务器防火墙80级8850端口打开 临时关闭SELinux/防火墙 setenforce 0 iptables -F 重点 重点 不能用root用户安装 不能用root用户安装 第一步先创建一 ...

  7. String.equals()方法、整理String类的Length()、charAt()、 getChars()、replace()、 toUpperCase()、 toLowerCase()、trim()、toCharArray()

    equals 是比较的两个字符串是否一样 length() 返回字符串的长度 charAt (int index) 返回index所指定的字符 getChars(int srcBegin,int sr ...

  8. Nmap 在 WSL 中工作不正常

    Problem binding to interface , errno: 92 socket_bindtodevice: Protocol not available Problem binding ...

  9. python-event事件-模仿红绿灯

    import time import threading event =threading.Event() def lighter(): count=0 event.set()#先设置成绿灯 whil ...

  10. python2.7.5升级到2.7.14或者直接升级到3.6.4

    python2.7.5升级到2.7.14 1.安装升级GCC yum install -y gcc* openssl openssl-devel ncurses-devel.x86_64  bzip2 ...