uoj140 【UER #4】被粉碎的数字
题目
看起来就像是数位\(\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】被粉碎的数字相关推荐
- 360文件粉碎机_中山三乡资料文件销毁粉碎销毁资料文件公司一览表
中山三乡资料文件销毁粉碎销毁资料文件公司一览表 安排搬运工作人员及运输车辆上门收取销毁物品,将需销毁的物品装上运输车辆,并进行拍照.车箱粘贴封条等工作.第五步:客户可安排工作人员,跟我公司销毁运输车辆 ...
- 电脑粉碎文件 c语言,C/C++ 编译器的命名粉碎规则(name mangling)和C/C++混合(ZZ)
http://hi.baidu.com 在面向对象编程语言出现之前,如果你想要打印不同类型的数据,需要写多个方法 ,象是PrintInteger(int i),PrintString(string s ...
- 力扣解题——求根到叶子节点数字之和
难度:中等 题目:给定一个二叉树,它的每个结点都存放一个 0-9 的数字,每条从根到叶子节点的路径都代表一个数字. 例如,从根到叶子节点路径 1->2->3 代表数字 123. 计算从根到 ...
- C++ 笔记(35)— std::to_string 转换整形数字为字符串
1. 函数原型 string to_string (int val); string to_string (long val); string to_string (long long val); s ...
- pandas dataframe 字符映射为数字
在机器学习中对于有序的类别型变量可以不采用onehot编码,直接使用有序数字代替即可,这个目的可以在pandas中使用map方法实现. import pandas as pd 创建数据框 raw_da ...
- 用0到9十个数字,每个数字使用一次,构成两个五位数a和b,并且a+20295=b.求a,b
方法1: 这是一开始想到的方法,代码稍微有点长. 首先,确定a数的范围,然后,取出a数其他位数上的数,存入列表中,a数各位上的数进行比较,然后根据a求出b的值,然后对b进行筛选,选出符合要求的b值.具 ...
- LeetCode简单题之有多少小于当前数字的数字
题目 给你一个数组 nums,对于其中每个元素 nums[i],请你统计数组中比它小的所有数字的数目. 换而言之,对于每个 nums[i] 你必须计算出有效的 j 的数量,其中 j 满足 j != i ...
- LeetCode中等题之重排数字的最小值
题目 给你一个整数 num .重排 num 中的各位数字,使其值 最小化 且不含 任何 前导零. 返回不含前导零且值最小的重排数字. 注意,重排各位数字后,num 的符号不会改变. 示例 1: 输入: ...
- LeetCode简单题之字符串转化后的各位数字之和
题目 给你一个由小写字母组成的字符串 s ,以及一个整数 k . 首先,用字母在字母表中的位置替换该字母,将 s 转化 为一个整数(也就是,'a' 用 1 替换,'b' 用 2 替换,- 'z' 用 ...
最新文章
- 让Exchange 2010 (2007适用)可以收发外部邮件
- 你的 A/B 测试数据期骗你了吗?
- 02.analyzer-tokenizer
- 用户体验——南通大学教务学生管理系统
- vue key重复_【第2112期】 import { reactive } from #39;vue#39;
- BeginnersBook Kotlin 教程
- C# Struct的内存布局
- could not connect to server: No route to host 	Is the server running on host 192.168.163.181 and a
- 使用Android开发工具23版更新Eclipse
- pandas快速把txt转为excel
- 计算机键盘怎么换键,电脑键盘怎么更改按键_电脑键盘怎么改键位
- jdk1.8的环境配置
- 小小光纤承载尖端技术 “中国制造”引领行业标准
- Thinkpad E430c 16GB内存安装成功
- win7系统域服务器,win7安装域服务器
- icon、png网页开发中所需要的小图标
- windows家庭版添加windows沙盒功能
- 一次成功的云存储接管实战
- C#使用TCP进行聊天通信(详细解析)
- 一个合格程序员应该读过的书