[数位dp] Pair

输入正整数A,B,C,统计满足1≤x≤A,1≤y≤B且至少满足下列条件之一:
①x and y > C
②x xor y < C
的对儿(x,y)有多少个.
数据范围:1≤A,B,C≤109.

分析

109的二进制数至多30位,所以我们在二进制下做数位dp.

至少满足①或②的对立面是既不满足①也不满足②,即x\ and\ y \le C(and条件)且x\ xor\ y \ge C(xor条件).我们转而统计这种对儿有多少个,因为这样做比较方便.

在设计dp之前,我们先思考一些简单的问题.

首先,我们考虑x和y的最高位,因为是最高位,所以仅就这1位而言它必然要同时满足and条件和xor条件,我们定义p\ and\ q= C为"边界and条件",p\ and\ q< C为"严格and条件",xor条件也做相同定义.那么最高位有这么4种可能:

①严格and,严格xor
那么后一位(次高位)就可以无视and和xor这两个条件了,因为无论如何都会满足的.
②边界and,严格xor
那么后一位可以无视xor这个条件了
③严格and,边界xor
那么后一位可以无视and这个条件了
④边界and,边界xor
那么nothing will happen

所以我们设计dp[i][and][xor]表示:考虑第i位,是/否满足and条件,是/否满足xor条件的方案数.如果最高位是30位,那么最终的答案是dp[30][1][1],后两个参数均为1表示满足and和xor条件.

但这样还有问题,就是我们没有考虑A,B对x,y的限制.
同样,从最高位的情况开始思考,对于x,y的最高位分别与A,B的关系我们有4种情况:

①x<A,y<B
那么后一位可以无视A,B的限制了
②x=A,y<B
那么后一位可以无视B的限制了
③x<A,y=B
那么后一位可以无视A的限制了
④x=A,y=B
那么nothing will happen

所以我们设计dp[i][and][xor][_A][_B],最后两个参数为1或0,表示是/否需要满足A和B的限制.如此我们最后的答案是dp[30][1][1][1][1].

然后我们考虑dp[i][and][xor][A][B]的转移.
枚举第i位x和y的值.

x A条件 y B条件 x and y and条件 x xor y xor条件
0 满足 0 满足 0 满足 0 不一定
0 满足 1 不一定 0 满足 1 满足
1 不一定 0 满足 0 满足 1 满足
1 不一定 1 不一定 1 不一定 0 不一定

我们发现,各种条件可能会限制x和y的取值.具体来说,如果A,B,C的第i位分别是a,b,c的话(a,b,c=0或1),那么有:
x ≤ (_A?a:1)
y ≤ (_B?b:1)
x&y ≤ (and?c:1)
x^y ≥ (xor?c:0)

在确定了某一种x和y之后,我们就可以转移到后一位的dp了,后一位的4个限制条件转移如下:
newand = and&(x&y==c)
newxor = xor&(x^y==c)
new_A = _A&(x==a)
new_B = _B&(y==b)

然后就可以写出如下程序:

#include<iostream>
#include<cstring>
using namespace std;
typedef long long ll;

ll A,B,C,dp[35][2][2][2][2];

ll dfs(int i,int And,int Xor,int _A,int _B){
    if(i==-1)return 1;
    ll& ans=dp[i][And][Xor][_A][_B];
    if(ans>=0)return ans;
    ans=0;
    int a=(A>>i)&1,
        b=(B>>i)&1,
        c=(C>>i)&1;
    for(int x=0;x<=1;x++)
    for(int y=0;y<=1;y++)
    if(x<=(_A?a:1)
        &&y<=(_B?b:1)
        &&(x&y)<=(And?c:1)
        &&(x^y)>=(Xor?c:0))
    {
        ans+=dfs(i-1,And&((x&y)==c),Xor&((x^y)==c),_A&(x==a),_B&(y==b));
    }
    return ans;
}

void solve(){
    scanf("%lld%lld%lld",&A,&B,&C);
    memset(dp,-1,sizeof dp);
    printf("%lld\n",A*B-(dfs(30,1,1,1,1)-max(B-C+1,0ll)-max(A-C+1,0ll)));
}

int main(){
    int T;scanf("%d",&T);
    while(T--)solve();
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,546评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,224评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,911评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,737评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,753评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,598评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,338评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,249评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,696评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,888评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,013评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,731评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,348评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,929评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,048评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,203评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,960评论 2 355

推荐阅读更多精彩内容

  • 专业考题类型管理运行工作负责人一般作业考题内容选项A选项B选项C选项D选项E选项F正确答案 变电单选GYSZ本规程...
    小白兔去钓鱼阅读 8,994评论 0 13
  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 3,345评论 0 2
  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 13,798评论 0 38
  • rljs by sennchi Timeline of History Part One The Cognitiv...
    sennchi阅读 7,332评论 0 10
  • Fortran Best Practices ====================== .. highligh...
    boliecon阅读 185评论 0 1