题意:一个数,如果满足奇数的数字出现偶数次,偶数的数字出现奇数次,

就是符合的数,注比如:12313  就满足,因为1 3出现了偶数次。2出现了奇数次

思路,对于这道题,就是状态压缩加dp;

对于一个数字来说,0~9每一位,都只有3种状态量,要么从未出现,要么出现次数为奇

要么为偶,所以可以用3进制来表示,通过3进制表示出其状态,然后到pos-1的时候

判断0~9的各个状态是否符合条件即可

 #include<cstdio>
#include<string.h>
using namespace std;
typedef long long ll;
ll dp[][];
ll a[];
int check(int s)
{
for(int i=;i<=;++i){
int k=s%;
s/=;
if(k==) continue;
else if((i&)&&k==) return ; //若为奇数,如果出现次数也为奇,则退出;
else if(!(i&)&&k==) return ; //若为偶数,。。。。。。。。。。。。。。
}
return ;
}
//三进制代码;
int change(int d,int s)
{
int temp[];
for(int i=;i<=;i++){
temp[i]=s%;
s/=;
}
s=;
if(temp[d]==) temp[d]=; //表示其状态的代码
else temp[d]=-temp[d]; //表示其状态的代码
for(int i=;i>=;i--)
s=s*+temp[i];
return s;
} ll dfs(ll pos,ll sum,bool flag,bool limit)
{
//flag是判断前导0用的
if(pos==-) return check(sum);
if(!limit&&dp[pos][sum]!=-) return dp[pos][sum];
int up=limit? a[pos]:;
ll ans=;
for(int i=;i<=up;i++)
//如果之前一直都是0,i==0,则sum的值依旧等于0
ans+=dfs(pos-,(flag==&&i==)? :change(i,sum),flag||i>,limit&&i==a[pos]);
if(!limit) dp[pos][sum]=ans; //如果i已经大于0,则再也没有前导0这一说法
return ans;
}
ll solve(ll x)
{
int pos=;
while(x){
a[pos++]=x%;
x/=;
}
return dfs(pos-,,,true);
}
int main()
{
int T;
scanf("%d",&T);
memset(dp,-,sizeof(dp));
while(T--){
ll l,r;
scanf("%lld%lld",&l,&r);
printf("%lld\n",solve(r)-solve(l-));
}
return ;
}

数位dp(Balanced Numbers )的更多相关文章

  1. Balanced Numbers (数位dp+三进制)

    SPOJ - BALNUM 题意: Balanced Numbers:数位上的偶数出现奇数次,数位上的奇数出现偶数次(比如2334, 2出现1次,4出现1次,3出现两次,所以2334是 Balance ...

  2. Balanced Numbers (数位DP)

    Balanced Numbers https://vjudge.net/contest/287810#problem/K Balanced numbers have been used by math ...

  3. SPOJ BALNUM - Balanced Numbers - [数位DP][状态压缩]

    题目链接:http://www.spoj.com/problems/BALNUM/en/ Time limit: 0.123s Source limit: 50000B Memory limit: 1 ...

  4. SPOJ10606 BALNUM - Balanced Numbers(数位DP+状压)

    Balanced numbers have been used by mathematicians for centuries. A positive integer is considered a ...

  5. Balanced Numbers(数位dp)

    Description Balanced numbers have been used by mathematicians for centuries. A positive integer is c ...

  6. spoj Balanced Numbers(数位dp)

    一个数字是Balanced Numbers,当且仅当组成这个数字的数,奇数出现偶数次,偶数出现奇数次 一下子就相到了三进制状压,数组开小了,一直wa,都不报re, 使用记忆化搜索,dp[i][s] 表 ...

  7. SPOJ - BALNUM Balanced Numbers(数位dp+三进制状压)

    Balanced Numbers Balanced numbers have been used by mathematicians for centuries. A positive integer ...

  8. SPOJ - BALNUM - Balanced Numbers(数位DP)

    链接: https://vjudge.net/problem/SPOJ-BALNUM 题意: Balanced numbers have been used by mathematicians for ...

  9. SPOJ BALNUM Balanced Numbers (数位dp)

    题目:http://www.spoj.com/problems/BALNUM/en/ 题意:找出区间[A, B]内所有奇数字出现次数为偶数,偶数字出现次数为计数的数的个数. 分析: 明显的数位dp题, ...

  10. HDU 3709 Balanced Number (数位DP)

    Balanced Number Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) ...

随机推荐

  1. jquery form表单赋值封装

    ;!(function ($) { $.fn.setFormValue = function (options) { var $this = $(this); $.each(options, func ...

  2. nohup npm start &启动之后关闭终端程序没有后台运行

    感谢:https://blog.csdn.net/nsj820/article/details/5862231 “在当shell中提示了nohup成功后,还需要按终端上键盘任意键退回到shell输入命 ...

  3. 【Unity|C#】基础篇(2)——栈与堆、值类型与引用类型

    传送门:https://www.cnblogs.com/moonache/p/6008048.html [笔记] 图1:值类型与引用类型 存储方式 > 值类型:数据直接存在栈中 > 引用类 ...

  4. 2019-08-20 纪中NOIP模拟A组

    T1 [JZOJ6310] Global warming 题目描述 给定整数 n 和 x,以及一个大小为 n 的序列 a. 你可以选择一个区间 [l,r],然后令 a[i]+=d(l<=i< ...

  5. pl/sql快速输入select * from等语句快捷键设置

    1.工具-->首选项 2.编辑器-->编辑 3.定义快捷键 -- > 保存 4.快捷键+回车就可以出现

  6. Numpy | ndarray数组基本操作

    搞不懂博客园表格的排版... 说明: 0 ndarray :多维数组对象 1 np :import numpy as np 2 nda :表示数组的名称 1 生成数组 函数名 描述 np.array ...

  7. 【kuangbin带你飞】 MST专题

    唉,被班级合唱和复变考试搞得心力交瘁.新算法学不进去,更新下吧 A - Til the Cows Come Home The Head Elder of the tropical island of ...

  8. centos7搭建天兔

    如果新系统尚未安装工具pip,可通过以下三步快速安装pip              1.  yum -y install epel-release               2.  yum -y ...

  9. navicat永久激活

    https://jingyan.baidu.com/article/f54ae2fc51f0311e92b84998.html

  10. [AtCoder Code Festival 2017 QualB D/At3575] 101 to 010 - dp

    [Atcoder Code Festival 2017 QualB/At3575] 101 to 010 有一个01序列,每次可以选出一个101,使其变成010,问最优策略下能操作几次? 考虑像 11 ...