1、http://acm.nbut.edu.cn/Problem/view.xhtml?id=1545
2、题目
-
[1545] New Year 2014
- 时间限制: 2000 ms 内存限制: 262144 K
- 问题描述
-
In the New Year 2014, Xiao Ming is thinking about the question: give two integers Nand K, Calculate the number of the numbers of satisfy the following conditions:
1. It is a positive integer and is not greater than N.
2. Xor value of its all digital is K.
For example N = 12, K = 3, the number of satisfy condition is 3 and 12(3 = 3, 1 ^ 2 = 3).
In order to let Xiao Ming happy in the New Year 2014, can you help him?
- 输入
-
There are multiple test cases, each test sample contains two positive integers N and K (0 <= N, K < 10 ^ 18), End to file.
- 输出
-
For each case, output the number of the numbers of satisfy condition in one line.
- 样例输入
-
12 3 999 5 12354 8
- 样例输出
-
2 76 662
- 提示
-
无
- 来源
-
宁静致远 @HBMY
3、比赛标程
简单的数位DP, dp[pos][statu] (statu 为异或值)!
本题有个trick, k等于0的时候要将答案减一(题目中要求数都为正的).#include<cstdio> #include<cstring> #include<iostream> using namespace std; #define lint long long int bit[30]; lint dp[30][20]; lint dfs(int pos,int x,bool limit) { if(pos<0) { if(limit)return 0; else return x==0; } if(!limit&&dp[pos][x]!=-1)return dp[pos][x]; int end=(limit==0)?9:bit[pos]; lint ans=0; for(int i=0;i<=end;++i) { ans+=dfs(pos-1,i^x,limit&&(i==end)); } dp[pos][x]=ans; return ans; } lint solve(lint n,int x) { int len=-1; memset(dp,-1,sizeof(dp)); while(n) { bit[++len]=n%10; n/=10; } return dfs(len,x,1); } int main() { //freopen("G:\\1.in","r",stdin); //freopen("G:\\1.out","w",stdout); lint n,x; while(cin>>n>>x) { if(x>15) { puts("0"); continue; } lint ans=solve(n+1,x); if(x==0)--ans; printf("%lld\n",ans); } return 0; }