题目

看起来就像是数位\(\rm dp\)

不妨从竖式乘法的角度来考虑这个问题

为了方便处理进位,我们得从低位向高位填数

设\(dp[i][0/1][j][p][t]\)表示填到了第\(i\)位,卡不卡上界,\(f(x)=j\),\(f(k\times x)=p\)(不计算最高位),需要向最高位进\(t\)的\(x\)有多少个

这里的卡上界比较奇怪,如果这一位上填的数大于\(R\)这一位上的数,那么就一定卡了上界,如果小于这一位上的数,那么就一定不卡上界,如果和原来的数相等,那么就继续之前的状态

所以这个\(0/1\)就表示后面的\(i\)为和\(R\)后\(i\)位的大小关系,如果填的数大于\(R\)后\(i\)为,那么这个状态就是\(1\);否则就是\(0\)

至于转移,就比较简单,我们枚举这一位上填什么数\(y\),那么对于\(x\),数位和增加了\(y\),对于\(k\times x\),这一位上直接来一个乘法是\(k\times y\),还有之前的进位\(t\),于是就是\((k\times y+t)\% 10\),新的进位就是\((k\times y+t)/10\)

但是这样我们填到\(R\)的最高位之后可能还有一些进位没有处理,于是再往前多处理\(3\)位把进位处理完

最后的答案就是\(\sum_{i}dp[\lg_{R}][0][i][i][0]\),即\(x\)的数位和等于\(f(k\times x)\)的情况,但是这样多了一维非常难受,考虑的最后只要求\(j=p\),所以我们直接把\(j-p\)看成一维状态就好了

代码

#include<bits/stdc++.h>
#define re register
#define LL long long
LL dp[25][2][1000][500];
int m,w,a[25],M=250;LL n;
inline void split(LL x) {while(x) a[++w]=(x%10),x/=10;
}
int main() {scanf("%lld%d",&n,&m);dp[0][0][0][M]=1;split(n);for(re int i=0;i<w+3;i++)for(re int j=0;j<2;++j)for(re int k=0;k<1000;++k)for(re int p=M-2*i*9;p<=M+2*i*9;++p) {if(!dp[i][j][k][p]) continue;for(re int t=0;t<10;++t)dp[i+1][t==a[i+1]?j:t>a[i+1]][(k+t*m)/10][p+t-(k+t*m)%10]+=dp[i][j][k][p];} printf("%lld\n",dp[w+3][0][0][M]-1);return 0;
}

转载于:https://www.cnblogs.com/asuldb/p/11455315.html

uoj140 【UER #4】被粉碎的数字相关推荐

  1. 360文件粉碎机_中山三乡资料文件销毁粉碎销毁资料文件公司一览表

    中山三乡资料文件销毁粉碎销毁资料文件公司一览表 安排搬运工作人员及运输车辆上门收取销毁物品,将需销毁的物品装上运输车辆,并进行拍照.车箱粘贴封条等工作.第五步:客户可安排工作人员,跟我公司销毁运输车辆 ...

  2. 电脑粉碎文件 c语言,C/C++ 编译器的命名粉碎规则(name mangling)和C/C++混合(ZZ)

    http://hi.baidu.com 在面向对象编程语言出现之前,如果你想要打印不同类型的数据,需要写多个方法 ,象是PrintInteger(int i),PrintString(string s ...

  3. 力扣解题——求根到叶子节点数字之和

    难度:中等 题目:给定一个二叉树,它的每个结点都存放一个 0-9 的数字,每条从根到叶子节点的路径都代表一个数字. 例如,从根到叶子节点路径 1->2->3 代表数字 123. 计算从根到 ...

  4. C++ 笔记(35)— std::to_string 转换整形数字为字符串

    1. 函数原型 string to_string (int val); string to_string (long val); string to_string (long long val); s ...

  5. pandas dataframe 字符映射为数字

    在机器学习中对于有序的类别型变量可以不采用onehot编码,直接使用有序数字代替即可,这个目的可以在pandas中使用map方法实现. import pandas as pd 创建数据框 raw_da ...

  6. 用0到9十个数字,每个数字使用一次,构成两个五位数a和b,并且a+20295=b.求a,b

    方法1: 这是一开始想到的方法,代码稍微有点长. 首先,确定a数的范围,然后,取出a数其他位数上的数,存入列表中,a数各位上的数进行比较,然后根据a求出b的值,然后对b进行筛选,选出符合要求的b值.具 ...

  7. LeetCode简单题之有多少小于当前数字的数字

    题目 给你一个数组 nums,对于其中每个元素 nums[i],请你统计数组中比它小的所有数字的数目. 换而言之,对于每个 nums[i] 你必须计算出有效的 j 的数量,其中 j 满足 j != i ...

  8. LeetCode中等题之重排数字的最小值

    题目 给你一个整数 num .重排 num 中的各位数字,使其值 最小化 且不含 任何 前导零. 返回不含前导零且值最小的重排数字. 注意,重排各位数字后,num 的符号不会改变. 示例 1: 输入: ...

  9. LeetCode简单题之字符串转化后的各位数字之和

    题目 给你一个由小写字母组成的字符串 s ,以及一个整数 k . 首先,用字母在字母表中的位置替换该字母,将 s 转化 为一个整数(也就是,'a' 用 1 替换,'b' 用 2 替换,- 'z' 用 ...

最新文章

  1. 让Exchange 2010 (2007适用)可以收发外部邮件
  2. 你的 A/B 测试数据期骗你了吗?
  3. 02.analyzer-tokenizer
  4. 用户体验——南通大学教务学生管理系统
  5. vue key重复_【第2112期】 import { reactive } from #39;vue#39;
  6. BeginnersBook Kotlin 教程
  7. C# Struct的内存布局
  8. could not connect to server: No route to host Is the server running on host 192.168.163.181 and a
  9. 使用Android开发工具23版更新Eclipse
  10. pandas快速把txt转为excel
  11. 计算机键盘怎么换键,电脑键盘怎么更改按键_电脑键盘怎么改键位
  12. jdk1.8的环境配置
  13. 小小光纤承载尖端技术 “中国制造”引领行业标准
  14. Thinkpad E430c 16GB内存安装成功
  15. win7系统域服务器,win7安装域服务器
  16. icon、png网页开发中所需要的小图标
  17. windows家庭版添加windows沙盒功能
  18. 一次成功的云存储接管实战
  19. C#使用TCP进行聊天通信(详细解析)
  20. 一个合格程序员应该读过的书

热门文章

  1. 有什么助于睡眠的方法,睡眠不好,一定要知道这些方法
  2. 2014黑帽大会揭露十大恐怖安全漏洞!
  3. 【转】以太坊 2.0 中的验证者经济模型
  4. Office办公 WPS如何设置页边距
  5. 谷歌浏览器插件开发之 manifest.json 配置说明
  6. iphone调整屏幕方向_如何锁定iPhone或iPad的屏幕方向
  7. 群表示论之Able群的不可约表示
  8. inc si指令的作用_亲水作用色谱(HILIC)(二):可选的固定相有哪些?
  9. 关于中国教育出来的学生
  10. 谷歌浏览器设置打开新标签页为指定网页?