bzoj 2992: Pku3986 Math teacher's homework 数位dp

13人阅读 评论(0) 收藏 举报
分类:

题意

给出两个整数K,N和一个整数序列M1,M2…Mn
求满足X1 Xor X2 Xor X3…Xor Xn=k且0<=Xi<=Mi(i=1…n)的解的个数
1n50,0k,m1,m2mn2311

分析

我们按从高到底位进行处理。
假设前i位都已经处理好了,若存在一个数x[t],满足前i位中某一位比M[t]要小,那么x[t]剩下的位就可以随便填。
既然这样,那么我们就可以先不填x[t],然后让剩下的数随便填,设其最终异或和为w,那么我们只要在x[t]填上w Xor K,则可以得到一组解。
也就是说若存在一位满足其已经没有大小的限制了,那么剩下的就可以随便填。
考虑枚举这是哪一位,再枚举该位第一个没有限制的数,剩下的位置只要dp一下就好了。

代码

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>

typedef long long LL;

const int N=55;
const int MOD=1000000003;

int n,m,bin[25],f[N][2],a[N];

int main()
{
    bin[0]=1;
    for (int i=1;i<=30;i++) bin[i]=bin[i-1]*2;
    scanf("%d%d",&n,&m);
    while (n||m)
    {
        for (int i=1;i<=n;i++) scanf("%d",&a[i]);
        int ans=0;
        for (int i=30;i>=0;i--)
        {
            for (int j=1;j<=n;j++)
            {
                if (!(a[j]&bin[i])) continue;
                int s=1,c=0;
                for (int k=1;k<j;k++) s=(LL)s*(a[k]%bin[i]+1)%MOD,c^=((a[k]&bin[i])>0);
                f[j][c]=s;f[j][c^1]=0;
                for (int k=j+1;k<=n;k++)
                    if (a[k]&bin[i])
                    {
                        f[k][0]=((LL)f[k-1][1]*(a[k]%bin[i]+1)%MOD+(LL)f[k-1][0]*bin[i]%MOD)%MOD;
                        f[k][1]=((LL)f[k-1][0]*(a[k]%bin[i]+1)%MOD+(LL)f[k-1][1]*bin[i]%MOD)%MOD;
                    }
                    else f[k][0]=(LL)f[k-1][0]*(a[k]%bin[i]+1)%MOD,f[k][1]=(LL)f[k-1][1]*(a[k]%bin[i]+1)%MOD;
                if (m&bin[i]) (ans+=f[n][1])%=MOD;
                else (ans+=f[n][0])%=MOD;
            }
            int c=0;
            for (int j=1;j<=n;j++) c^=a[j]&bin[i];
            if (c!=(m&bin[i])) break;
        }
        int t=0;
        for (int i=1;i<=n;i++) t^=a[i];
        if (t==m) (ans+=1)%=MOD;
        printf("%d\n",ans);
        scanf("%d%d",&n,&m);
    }
    return 0;
}
查看评论

hdu 3693 Math teacher's homework(数位dp)

题意:给出n个数,每个数字代表0到这个数字的范围,每个里面要选一个,求异或和为K的情况总数。 做法:挺难想的一个dp,我们把这些数换成2进制组成一个表格,首先可以明确一点,只要有一位可以随便放的二进...
  • u012962816
  • u012962816
  • 2015-08-12 01:36:32
  • 1017

HDU 3693 Math teacher's homework (数位DP?)

题意:求解下列方程的解的数量: X1 xor X2 xor X3 ... xor Xn = k 其中对任意Xi, 0 可以看出来是数位DP的思路~ 但是思路并不是很清晰~ 令dp[i][pre...
  • SnowDUT
  • SnowDUT
  • 2016-06-03 20:23:55
  • 470

uva 1489 - Math teacher's homework(数位dp)

题目链接:uva 1489 - Math teacher's homework 题目大意:给定n,k,以及序列m1,m2,…,mn, 要求找到一个长度为n的序列,满足0=xi=mi, 并且x1X...
  • u011328934
  • u011328934
  • 2014-07-30 22:30:07
  • 1132

[POJ3986]Math teacher's homework && 数位DP

首先假设xi足够大 就会有 ans = (m1 + 1) * (m2 + 1) * ... *(mi-1 + 1) * (mi+1 + 1) *.... 因为对于此时xi = x1 ^ x2 ^ x3...
  • shiyukun1998
  • shiyukun1998
  • 2015-05-19 20:29:54
  • 843

Homework of English

Homework of EnglishThe English teacher give Nobita a very very strange homework. And Nobita am reall...
  • LuRiCheng
  • LuRiCheng
  • 2017-04-24 20:02:05
  • 253

Homework of PE dp 正难则反

Problem D: Homework of PE Time Limit: 1 Sec Memory Limit: 128 MB Submit: 117 Solved: 37 [Submit...
  • now_ing
  • now_ing
  • 2017-12-02 09:09:10
  • 85

hdu 1219 hash

Problem Description Ignatius is doing his homework now. The teacher gives him some articles and ask...
  • q451792269
  • q451792269
  • 2017-09-06 08:00:36
  • 126

POJ 3526 The Teacher’s Side of Math 高斯消元

The Teacher’s Side of Math Time Limit: 5000MS   Memory Limit: 65536K Total Submissio...
  • sinat_35406909
  • sinat_35406909
  • 2017-08-11 01:40:45
  • 178

[BZOJ 1833] count 数字计数 数位DP(附数位DP总结)

题目传送门:【BZOJ 1833】题目大意:给定两个正整数 a 和 b,求在 [a,b] 中的所有整数中,每个数码 (digit,指 0-9 ) 各出现了多少次。其中 a ≤ b ≤ 1012^{12...
  • ArcCCcp
  • ArcCCcp
  • 2017-10-11 12:15:47
  • 325

hdu1074Doing Homework【状态压缩】

Problem Description Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lot of h...
  • zhou_yujia
  • zhou_yujia
  • 2016-01-07 09:45:40
  • 705
    个人资料
    持之以恒
    等级:
    访问量: 26万+
    积分: 1万+
    排名: 1482
    文章分类
    最新评论