数位DP。

  比较蛋疼的是,设a[i]表示第i位上数字,比方说a[1]<a[2]>a[3],且a[1]==a[3]时,这两位上的数可以放在一起搞掉。

  所以就在正常的f数组里多开一维,表示后面那些位组成的不增的单调栈中,包含的数字集合。

  f[i][j][k][a]表示i位,首位为j,单调栈数字集合为k,最小消除数为a的数字个数。

  从已知往外推好像好写一点。。

  枚举f[i1][j1][k1][a1],再枚举下一个首位j

  若j<j1: f[i1+1][j][ (k1%2^(j+1))|2^j ][ a1+(2^j&k1?0:1) ]+=f[i1][j1][k1][a1];

  若j==j1:f[i1+1][j][k1][a1]+=f[i1][j1][k1][a1];

  若j>j1:  f[i1+1][j][k1+2^j][a1+1]+=f[i1][j1][k1][a1];

  统计答案时,就在记录一下已确定高位的不减单调栈就行了。。。

  很(jiao)显(wan)而(cai)易(fa)见(xian)的是...j那维是没用的,因为j肯定是k的最大位...所以每个k都对应着唯一的j

  反正都交了。。就懒得改了>_<

 #include<cstdio>
#include<iostream>
#include<cstring>
#define ll long long
using namespace std;
ll f[][][][];
int two[],one[];
int i,j,k,n,m,aa;
int s[],st[],top;
ll L,R; inline void prerun(){
register int k1,a1,j;int i1,j1,i;ll now;
for(i=one[]=two[]=;i<;i++)two[i]=two[i-]<<,one[i]=one[i-]<<|;
for(i=;i<;i++)f[][i][two[i]][i!=]=;
for(i1=;i1<;i1++)
for(j1=;j1<;j1++)for(k1=two[j1];k1<=one[j1];k1++)for(a1=;a1<=i1&&a1<=aa;a1++)
if(f[i1][j1][k1][a1]){
now=f[i1][j1][k1][a1];
f[i1+][][][a1]+=now;
for(j=;j<j1;j++)
f[i1+][j][(k1&one[j])|two[j]][a1+!(k1&two[j])]+=now;
if(j1!=)f[i1+][j1][k1][a1]+=now;
for(j=j1+;j<;j++)
f[i1+][j][k1|two[j]][a1+]+=now;
}
}
inline int calc(int k){
register int sm=,i;
for(i=;i<=top;i++)if((st[i]!=st[i-]||i==)&&st[i]>)
if(!(two[st[i]]&k))sm++;
return sm;
}
inline ll get(ll x){
if(!x)return ;
ll tmp=x,ans=;int len=;register int i,j,k;
while(tmp)s[++len]=tmp%,tmp/=;
for(i=;i<len;i++)for(j=;j<=;j++)for(k=two[j];k<=one[j];k++)
ans+=f[i][j][k][aa];
for(j=;j<s[len];j++)for(k=two[j];k<=one[j];k++)
ans+=f[len][j][k][aa];
int pre=,tmpa;st[top=]=s[len];
for(i=len-;i;i--){
if(pre>aa)break;
for(j=;j<s[i];j++)
for(k=two[j];k<=one[j];k++)
if((tmpa=aa-pre-calc(k))>=)
ans+=f[i][j][k][tmpa];
while(top&&st[top]>s[i])pre+=(st[top]!=st[top-]||top==),top--;
st[++top]=s[i];
}
if(pre+calc()==aa)ans++;
return ans;
}
int main(){
scanf("%lld%lld%d",&L,&R,&aa);
prerun();
printf("%lld\n",get(R)-get(L-));
return ;
}

[51nod Round 15 B ] 完美消除的更多相关文章

  1. bzoj 1006: [HNOI2008]神奇的国度 弦图的染色问题&&弦图的完美消除序列

    1006: [HNOI2008]神奇的国度 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 1788  Solved: 775[Submit][Stat ...

  2. 无向图的完美消除序列 判断弦图 ZOJ 1015 Fish net

       ZOJ1015 题意简述:给定一个无向图,判断是否存在一个长度大于3的环路,且其上没有弦(连接环上不同两点的边且不在环上). 命题等价于该图是否存在完美消除序列. 所谓完美消除序列:在 vi,v ...

  3. UOJ Round #15 [构造 | 计数 | 异或哈希 kmp]

    UOJ Round #15 大部分题目没有AC,我只是水一下部分分的题解... 225[UR #15]奥林匹克五子棋 题意:在n*m的棋盘上构造k子棋的平局 题解: 玩一下发现k=1, k=2无解,然 ...

  4. BestCoder Round#15 1001-Love

    http://acm.hdu.edu.cn/showproblem.php?pid=5082 Love Time Limit: 2000/1000 MS (Java/Others)    Memory ...

  5. BZOJ 1006 完美消除序列&最大势算法&弦图

    K国是一个热衷三角形的国度,连人的交往也只喜欢三角原则.他们认为三角关系:即AB相互认识,BC相互认识,CA相互认识,是简洁高效的.为了巩固三角关系,K国禁止四边关系,五边关系等等的存在.所谓N边关系 ...

  6. HYNB Round 15: PKU Campus 2019

    HYNB Round 15: PKU Campus 2019 C. Parade 题意 将平面上n*2个点安排在长度为n的两行上. 做法 首先可以忽略每个点之间的影响,只用考虑匹配即可 然后把所以点归 ...

  7. 51NOD 1623 完美消除 数位DP

    题目描述: 定义数的消除操作为选定[L,R,x],如果数的第L到第R位上的数字都大于等于x,并且这些数都相等,那么该操作是合法的(从低位到高位编号,个位是第一位,百位是第二位……),然后将这些位数上的 ...

  8. 51nod 1623 完美消除(数位DP)

    首先考虑一下给一个数如何求它需要多少次操作. 显然用一个单调栈就可以完成:塞入栈中,将比它大的所有数都弹出,如果栈中没有当前数,答案+1. 因为数的范围只有0~9,所以我们可以用一个二进制数来模拟这个 ...

  9. Educational Codeforces Round 15 C. Cellular Network(二分)

    C. Cellular Network time limit per test 3 seconds memory limit per test 256 megabytes input standard ...

随机推荐

  1. WindowsServer2012 搭建域错误“本地Administraor账户不需要密码”

    标签:MSSQL/SQLServer/域控制器提升的先决条件验证失败/密码不符合要求 概述 在安装WindowsServer2012域控出现administrator账户密码不符合要求的错误,但是实际 ...

  2. Kotlin——最详细的常量、变量、注释的使用

    在Kotlin中的变量.常量以及注释多多少少和Java语言是有着不同之处的.不管是变量.常量的定义方式,还是注释的使用.下面详细的介绍Kotlin中的变量.常量.注释的使用.以及和Java的对比. 如 ...

  3. Find all factorial numbers less than or equal to N

    A number N is called a factorial number if it is the factorial of a positive integer. For example, t ...

  4. cat/tac/more/less 命令详解

    cat:(http://www.cnblogs.com/peida/archive/2012/10/30/2746968.html) *cat主要有三大功能:1.一次显示整个文件:cat filena ...

  5. Golang 网络爬虫框架gocolly/colly 一

    Golang 网络爬虫框架gocolly/colly 一 gocolly是用go实现的网络爬虫框架,目前在github上具有3400+星,名列go版爬虫程序榜首.gocolly快速优雅,在单核上每秒可 ...

  6. C# winForm资源文件实现多语言切换

    这是我目前看到过最简单的多语言切换了 操作步驟 介面上的多語 Step1.將表單的Localizable屬性設為True Step2.切換表單的Language屬性為欲使用的語系 設完後會在分頁標籤上 ...

  7. Android studio Error:org.gradle.api.internal.tasks.DefaultTaskInputs$TaskInputUnionFileCollection cannot be cast to

    http://blog.csdn.net/FlyRabbit_1/article/details/74536317 Error:org.gradle.api.internal.tasks.Defaul ...

  8. 前端生成验证码图片utils

    <%@ page language="java" contentType="text/html; charset=UTF-8"     pageEncod ...

  9. Spring之设置Bean值

    Java实例的属性值可以有很多种数据类型.基本类型值.字符串类型.java实例甚至其他的Bean实例.java集合.数组等.所以Spring允许通过如下几个元素为Bean实例的属性指定值: value ...

  10. Linux(Cent OS7.2)下启动停止memcached方法及ps命令使用讲解

    Linux下,以Cent OS7.2为例,安装memcached后的启动方法很简单,这里我们使用yum源安装. 首先查找yum源版本库的memchaced安装包, yum list | grep me ...