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...

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

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

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

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

POJ 3243 Clever Y 求A^X = B (mod C) / BabyStep_GiantStep

题意:求最小的x使得A^X = B (mod C) 题解: 【扩展Baby Step Giant Step解决离散对数问题】 作者 AekdyCoin ! 【普通Bab...
  • Tsaid
  • Tsaid
  • 2012-03-14 21:26
  • 3201

【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 #...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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