题目

看起来就像是数位\(\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;
}

uoj140 【UER #4】被粉碎的数字的更多相关文章

  1. [UOJ #140]【UER #4】被粉碎的数字

    题目大意:定义$f(x)$为数字$x$每一位数字的和,求$\sum\limits_{i=1}^R[f(x)=f(kx)]$.$R\leqslant10^{18},k\leqslant10^3$ 题解: ...

  2. C语言 · 判定数字

    编写函数,判断某个给定字符是否为数字. 样例输入 9 样例输出 yes #include<stdio.h> int main(){ char c; scanf("%c" ...

  3. excel 日期/数字格式不生效需要但双击才会生效的解决办法

    原因: Excel2007设置过单元格格式后,并不能立即生效必须挨个双击单元格,才能生效.数据行很多.效率太低. 原因:主要是一些从网上拷贝过来的日期或数字excel默认为文本格式或特殊-中文数字格式 ...

  4. JavaScript求两个数字之间所有数字的和

    这是在fcc上的中级算法中的第一题,拉出来的原因并不是因为有什么好说的,而是我刚看时以为是求两个数字的和, 很显然错了.我感觉自己的文字理解能力被严重鄙视了- -.故拉出来折腾折腾. 要求: 给你一个 ...

  5. Xamarin Android 应用程序内图标上数字提示

    最近在用 Xamarin 做一个 Android 应用,打开应用时,如果有新消息,需要在应用内的 Toolbar 或者首页的图标上显示数字提示.在这里和大家分享一下实现方法,如果你有更新好的实现方法, ...

  6. C# WinForm使用乐器数字接口

    继续,前面已经实现了C#调用Windows API实现了弹出对话框功能.使用了User32.dll文件,主要代码如下: [DllImport("User32.dll")]publi ...

  7. 04实现累加和计算功能并且实现textbox不允许输入数字以外的字符但不包括退格键同时不允许第一个数值为0

    private void button1_Click(object sender, EventArgs e) { double number1, number2; if (double.TryPars ...

  8. js验证输入的是否是数字,小数保留几位小数

    1.验证方法 validationNumber(e, num)  e代表标签对象,num代表保留小数位数 function validationNumber(e, num) { -]+\.?[-]*$ ...

  9. 原生js可爱糖果数字时间特效

    效果展示:http://hovertree.com/texiao/js/35/ 数字采用漂亮的糖果皮肤设计 效果图: 代码如下: <!DOCTYPE html> <html> ...

随机推荐

  1. appium自动化获取app的appPackage与appActivity方法总结

    一,获取apppackage 方法不止一种,我只介绍自己知道的两种. 1,通过APPIUM工具添加APK包后,会自动显示出来. 2,打开UI AUTOMATOR VIEWER 定位工具,随便指向一个定 ...

  2. [参考]C# JSON字符串序列化与反序列化

    C#将对象序列化成JSON字符串 public string GetJsonString() { List<Product> products = new List<Product& ...

  3. 如何使用Intellij IDEA工具导入SVN项目

    Intellij IDEA是目前主流的IDE开发工具,工程项目导入也是必不可少的操作,本文讲述如何用 IDEA工具导入SVN项目. 步骤一:选择VCS打开Intellij IDEA开发工具,在导航栏中 ...

  4. 7-MySQL-Ubuntu-操作数据表的基本操作(二)

    修改数据表的结构 (1)向数据表中添加新的字段 alter table 表名 add 字段名 类型及约束;  (2)修改字段的属性(字段的数据类型和约束) 注:modify不能修改字段名,只能修改字段 ...

  5. zabbix--添加host

    在client配置好zabbix_agent后,如果server端没配置自动发现,那就需要创建添加host. 首先找到地方.Configuration--Hosts--Create Host 创建ho ...

  6. (数据科学学习手札57)用ggplotly()美化ggplot2图像

    一.简介 经常利用Python进行数据可视化的朋友一定用过或听说过plotly这样的神器,我在(数据科学学习手札43)Plotly基础内容介绍中也曾做过非常详细的介绍,其渲染出的图像以浏览器为载体,非 ...

  7. springcloud中config启动时候报错Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'config.info' in value "${config.info}"

    -noverify -Dspring.output.ansi.enabled=always -Dcom.sun.management.jmxremote -Dcom.sun.management.jm ...

  8. touch - 修改文件的时间戳记.

    总览 touch [-acm][-r ref_file(参照文件)|-t time(时间值)] file(文件名)... 被废弃的版本: touch [-acm][ugly_time] file(文件 ...

  9. vscode编程nodejs初始安装

    nodejs官网 http://nodejs.cn/ 1.安装nodejs,记得安装时勾选配置路径 在cmd中输入node,进去node环境即为安装成功. 2.安装vscode,并安装插件node e ...

  10. js 数组排序 根据两个字段属性

    var task = [ {name:"aa", taskLevel:"3",createTime:"2019-12-18"}, {name ...