http://acm.bnu.edu.cn/v3/contest_show.php?cid=9208#problem/J

【AC】

 #include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll N,K;
ll dp[][];
ll cnt[];
int sumdigit(ll x)
{
int tot=;
while(x)
{
tot+=x%;
x/=;
}
return tot;
}
int digit[];
int split(ll x)
{
int ret=;
while(x)
{
digit[++ret]=x%;
x/=;
}
reverse(digit+,digit++ret);
return ret;
} void Dp(int len)
{
memset(dp,,sizeof(dp));
//从高位到低位递推
for(int i=;i<digit[];i++)//最高位
{
dp[][i]=;
}
int sum=digit[];
for(int i=;i<=len;i++)
{
for(int j=;j<;j++)
{
if(dp[i-][j])//不为0才有贡献
for(int tran=;tran<;tran++)//从高到底第i位
{
if(j+tran<)
{
dp[i][j+tran]+=dp[i-][j];
}
}
}
for(int j=;j<=;j++) dp[i][j]++;//因为初始化dp[1][i]时dp[1][0]为0,所以要补上000..j这种情况
for(int j=;j<digit[i];j++) dp[i][sum+j]++;//因为初始化dp[1][digit[1]]为0,所以要补上只有第i位不同的情况
sum+=digit[i];
}
dp[len][sum]++;//算的是小于等于x的数,要加上本身
} ll cal(ll X,int sum,int type)
{
int len=split(X);
Dp(len);
if(type==)//[1,X]中位数和小于sum的总数
{
ll ans=;
for(int i=;i<sum;i++)
{
ans+=dp[len][i];
}
return ans;
}
else //[1,x]中位数和恰好为sum的总数
{
return dp[len][sum];
}
} ll solve(ll X,ll k)
{
int len=split(X);
Dp(len);
for(int i=;i<;i++)
{
cnt[i]=dp[len][i];
}
for(int i=;i<;i++)
{
cnt[i]+=cnt[i-];
}
ll pos=lower_bound(cnt+,cnt+,k)-cnt;
k-=cnt[pos-];
ll l=,r=1e18;
while(l<=r)
{
ll mid=(l+r)>>;
if(cal(mid,pos,)<k)
{
l=mid+;
}
else
{
r=mid-;
}
}
return l;
}
int main()
{
while(~scanf("%I64d%I64d",&N,&K))
{
cout<<cal(N,sumdigit(K),)+cal(K,sumdigit(K),)<<" ";
cout<<solve(N,K)<<endl;
}
return ;
}

数位DP

【数位DP】bnuoj 52813 J. Deciphering Oracles的更多相关文章

  1. Tsinsen A1516. fx 数位dp

    题目: http://www.tsinsen.com/A1516 A1516. fx 时间限制:2.0s   内存限制:256.0MB    总提交次数:164   AC次数:72   平均分:51. ...

  2. BZOJ 3209: 花神的数论题 [数位DP]

    3209: 花神的数论题 题意:求\(1到n\le 10^{15}\)二进制1的个数的乘积,取模1e7+7 二进制最多50位,我们统计每种1的个数的数的个数,快速幂再乘起来就行了 裸数位DP..\(f ...

  3. BZOJ_1833_[ZJOI2010]count 数字计数_数位DP

    BZOJ_1833_[ZJOI2010]count 数字计数_数位DP 题意: 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. 分析: 数位DP f[i][ ...

  4. [bzoj1833][ZJOI2010]数字计数(数位DP)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1833 分析:简单的数位DP f[i][j][k]表示在i位数.最高位j的所有数字中k的 ...

  5. Hdu Bomb(数位DP)

    Bomb Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others) Total Submiss ...

  6. 「算法笔记」数位 DP

    一.关于数位 dp 有时候我们会遇到某类问题,它所统计的对象具有某些性质,答案在限制/贡献上与统计对象的数位之间有着密切的关系,有可能是数位之间联系的形式,也有可能是数位之间相互独立的形式.(如求满足 ...

  7. BNUOJ 52325 Increasing or Decreasing 数位dp

    传送门:BNUOJ 52325 Increasing or Decreasing题意:求[l,r]非递增和非递减序列的个数思路:数位dp,dp[pos][pre][status] pos:处理到第几位 ...

  8. 2018 ACM 国际大学生程序设计竞赛上海大都会赛重现赛 J Beautiful Numbers (数位dp)

    题目链接:https://ac.nowcoder.com/acm/contest/163/J 题目大意:给定一个数N,求区间[1,N]中满足可以整除它各个数位之和的数的个数.(1 ≤ N ≤ 1012 ...

  9. The 2018 ACM-ICPC上海大都会赛 J Beautiful Numbers (数位DP)

    题意:求小于等于N且能被自己所有位上数之和整除的数的个数. 分析:裸的数位dp.用一个三位数组dp[i][j][k]记录:第i位,之前数位之和为j,对某个mod余数为k的状态下满足条件的个数.这里mo ...

随机推荐

  1. EJB2.0版本的HelloWorld

    EJB2.0版本的HelloWorld   虽然EJB3.1已经出来了,可是EJB2.0的项目还需要维护啊.下面写个简单EJB2.0的HelloWorld程序,练练手.   环境: JBoss 4.0 ...

  2. ImportError: No module named flask.ext.wtf 解决方法

    install pip install flask.ext.wtf

  3. 使用python模拟登陆百度

    #!/usr/bin/python # -*- coding: utf- -*- """ Function: Used to demostrate how to use ...

  4. Fedora19 有关输入法的无法切换问题 和 终端的快捷设置问题

    Fedora19 有关输入法的无法切换问题 和 终端的快捷设置问题 1.首先,要单击右上角的设置输入法的"区域与语言设置",要设置为“为每个窗口设置不同的输入源”. 还有,刚使用的 ...

  5. root.sh脚本支持checkpoints文件实现重复运行

    安装集群GRID/GI一般包括三个过程:首先,运行OUI/RunInstaller输入集群配置信息,其次,拷贝/编译集群文件,最后,以root用户运行root.sh脚本配置集群/启动集群,其中运行ro ...

  6. UVa-101-木块问题

    这题用vector比较好写,我们设置对应的几个函数,然后进行相应的操作来简化代码,这样才不易出错. 对于输入和操作来说我们经分析之后,可以看到最后一个操作时最原始的操作也就是不需要还原任意一个堆任意高 ...

  7. 【分块】[HNOI2010]弹飞绵羊&分块大法祭

    分块(似乎还有一种动态树(LCT)做法) 第一次学习分块,似乎有点小激动 这是黄学长的分块入门博客「分块」数列分块入门1 – 9 by hzwer 题目描述 某天,Lostmonkey发明了一种超级弹 ...

  8. [LUOGU] P1880 [NOI1995]石子合并

    题目描述 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试设计出1个算法,计算出将N堆石子合并成1 ...

  9. GIMP里的Path移动,旋转,翻转操作

    1/Path的移动: 快捷键Ctrl+Move Tool 2/Path的旋转: 选择Rotate Tool,在Path中选择,出现十字圈. Angel下的滑块调节一定的角度,在合适的位置即可. 3/P ...

  10. shell-code-3-echo用法&printf用法

    ××××××××××××××××××××××××××××××下面是echo××××××××××××××××××××××××××××××× # read 命令从标准输入(即执行时,键盘的输入)中读取一行 ...