2014 GCJ Round 1B New Lottery Game(数位dp,x小于等于A,y小于等于B,并且x&y值小于等于K的数字个数)

原创 2016年08月31日 00:41:20

题目链接:
2014 GCJ Round 1B New Lottery Game
题意:
xA,yB,并且x&y值小于等于K的数字个数。
数据范围:A,B,K109
分析:
官方题解在这里:Here。通篇读下来很有意思,对于理解数位dp很有帮助。

一般的数位dp我们在dfs的时候只记录一个limit表示是否达到区间上限,这里我们需要记录三个,因为x,y和二进制与出来的值都有上限。

// GCJ 2014 #Round1B New Lottery Game
//https://code.google.com/codejam/contest/2994486/dashboard#s=p1&a=1

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
using namespace std;
typedef long long ll;

int T, cases = 0;
ll A, B, K;
ll vis[35][3][3][3];

ll solve(int cur, int lessA, int lessB, int lessK)
{
    if (cur == -1) return lessA && lessB && lessK;
    if (vis[cur][lessA][lessB][lessK] != -1) return vis[cur][lessA][lessB][lessK]; 
    int MaxA = lessA || ((A >> cur) & 1);
    int MaxB = lessB || ((B >> cur) & 1);
    int MaxK = lessK || ((K >> cur) & 1);
    ll ret = solve(cur - 1, MaxA, MaxB, MaxK); // 0 & 0 = 0 
    if (MaxA) ret += solve(cur - 1, lessA, MaxB, MaxK); // 0 & 1 = 0 
    if (MaxB) ret += solve(cur - 1, MaxA, lessB, MaxK); // 1 & 0 = 0 
    if (MaxA && MaxB && MaxK) ret += solve(cur - 1, lessA, lessB, lessK); // 0 & 0 = 0
    return vis[cur][lessA][lessB][lessK] = ret;
}

int main()
{
    scanf("%d", &T);
    while (T--) {
        scanf("%lld%lld%lld", &A, &B, &K);
        memset(vis, -1, sizeof(vis));
        printf("Case #%d: %lld\n", ++cases, solve(31, 0, 0, 0));
    }
    return 0;
}
版权声明:缥缈玉京人,想语然、京兆眉妩。

如果令 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 分别等于

如果令 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 分别等于 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15...

【Codeforces Round 330 (Div 2)B】【数值统计 端点思维】Pasha and Phone 电话号码 每块数是x倍数却不能以y开头方案数

B. Pasha and Phone time limit per test 1 second memory limit per test 256 megabytes ...

莫比乌斯反演1-x1-y,中的质数GCD(a,b)

题意:给定两个数和,其中,,求为质数的有多少对?其中和的范      围是。 #include #include #include using namespace std; typ...

【Good Bye 2014E】【贪心 单调栈+线段树】New Year Domino 至少增加多高长度的多米诺骨牌才可推x倒y

New Year Domino time limit per test 2 seconds memory limit per test 256 megabytes i...

给你5个数a,b,c,d,k。x属于[a,b]y属于[c,d]。 问你有多少对(x,y)的公约数为k

题目大意:给你5个数a,b,c,d,k。x属于[a,b]y属于[c,d]。 问你有多少对(x,y)的公约数为k。 注意(x,y)和 (y,x)视为同一对。 x是[1,b],y是[1,d],求GC...

有一个任务队列,分别有A、B、C三种类型的任务,设计一种功能,让三种任务分别按照x:y:z(具体比例可配置)的比例进行执行

朋友的面试题,如下 有一个任务队列,分别有A、B、C三种类型的任务,设计一种功能,让三种任务分别按照x:y:z(具体比例可配置)的比例进行执行 解之。 主要的思路是lock+condition处...

Java编程机试:获取某一字符串中(只要字母),每一个字母出现的次数输出格式为a(x)b(y)c(z).....m(n)

Java编程:Map集合编程,要求如下:获取某一字符串如:"ag cCCCde3766ddgdfelakgjh"中,每一个字母(只要字母)出现的次数;要求输出格式是:a(2)b(1)h(4)........

【一道数学题】从(0,0)点经过(x,y)点到达(a,b)点的最短路径有多少条

如上图的题目,其中的A视为原点,X和B可以推广到任意坐标。计算代码如下: public static void main(String[] args) { deal(4, 4, ...
  • leeqihe
  • leeqihe
  • 2017年10月25日 17:21
  • 55

【2015-2016 ACM-ICPC, NEERC, Northern Subregional Contest B】【构造】Black and White 构造棋盘使得两种棋子联通块数恰为x与y

#include #include #include #include #include #include #include #include #include #include #include #...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:2014 GCJ Round 1B New Lottery Game(数位dp,x小于等于A,y小于等于B,并且x&y值小于等于K的数字个数)
举报原因:
原因补充:

(最多只允许输入30个字)