『月之谜 数位dp』
<更新提示>
<第一次更新>
<正文>
月之谜
Description
打败了Lord lsp 之后,由 于lqr 是一个心地善良的女孩 子,她想净化Lord lsp 黑化的 心,使他变回到原来那个天然 呆的lsp……在倒霉的光之英 雄applepi 的指引下,lqr 来到 了月之泉。月之泉的精灵告诉 她,想要净化Lord lsp 的话, 就要解出月之泉的谜题。
具体地来说是这样的,定 义月之数为能够被其十进制 表示下各个数位的和整除的数。给定整数L,R,你需要计算出区间[L, R]中有多少个月之数。 lqr 发觉这不是数学竞赛能够解决的问题,于是她又找到了你……所以说你需要帮助她解决 这个问题。
Input Format
输入包含多个测试数据。
每组测试数据占一行,含有两个整数L 和R。
输入文件以EOF 结束。
Output Format
对于每组测试数据,在单独的一行内输出结果。
Sample Input
1 100
101 200
Sample Output
33
26
解析
有点复杂,但肯定还是数位\(dp\)。
设\(f[i][j][k][l]\)表示长度为\(i\)的数,各个数位之和为\(j\),数值\(\bmod\ k=l\)的月之数个数。状态的二三四维,其实都是为了满足统计答案的限制服务的。
还是考虑最高位填的数字是什么,可以得到状态转移方程:
\]
这个方程的边界比较难以处理,所以我们可以暴力计算出\(i=0\)和\(i=1\)时有关状态的\(dp\)值。
然后就是考虑得到区间\([1,n]\)中月之数的个数。首先我们枚举各位数字之和\(sum\),然后还是从高位开始枚举,得到与原数不同的第一个位\(i\),假设\(n=\sum_{i=1}^{cnt}num[i]\times10^{i-1}\),就是\(n\)的十进制各个位,并且当前我们得到了$$t=\sum_{j=1}{i-1}num[j],q=\left(\sum_{j=1}{i-1}num[j]\times10^{j-1}\right)\bmod sum$$
那么我们枚举这一位填的值\(p\),若\(p<num[i]\),则后面可以随便填,累加答案\(f[i-1][sum-t-p][sum][(sum-q-p\times 10^{i-1})\bmod sum]\)。反之,若\(p=num[i]\),则更新\(t,q\),继续尝试下一位即可。
\(Code:\)
#include <bits/stdc++.h>
using namespace std;
const int N = 12 , S = 92;
long long f[N][S][S][S],Pow[N];
int num[N];
inline int sub(long long a,long long b,int mod) { return ( ( a - b ) % mod + mod ) % mod; }
inline void Prepdp(void)
{
    Pow[0] = 1;
    for (int i=1;i<=10;i++) Pow[i] = Pow[i-1] * 10;
    for (int k=1;k<=90;k++) f[0][0][k][0]++;
    for (int i=0;i<=9;i++)
        for (int k=1;k<=90;k++)
            f[1][i][k][i%k]++;
    for (int i=2;i<=10;i++)
        for (int j=0;j<=i*9;j++)
            for (int k=1;k<=90;k++)
                for (int l=0;l<k;l++)
                    for (int p=0;p<=min(9,j);p++)
                        f[i][j][k][l] += f[i-1][j-p][k][sub(l,p*Pow[i-1],k)];
}
inline long long solve(long long x)
{
    if ( x == 0 ) return 0;
    int cnt = 0; long long res = 0 , y = x , s = 0;
    memset( num , 0 , sizeof num );
    while ( x ) s += num[++cnt] = x % 10 , x /= 10;
    if ( y % s == 0 ) res++;
    for (int sum=1;sum<=90;sum++)
    {
        int t = 0 , q = 0;
        for (int i=cnt;i>=1;i--)
        {
            for (int p=0;p<min(num[i],sum-t+1);p++)
                res += f[i-1][sum-t-p][sum][sub(sum,q+p*Pow[i-1],sum)];
            t += num[i] , q = ( q + num[i] * Pow[i-1] ) % sum;
            if ( t > sum ) break;
        }
    }
    return res;
}
int main(void)
{
    Prepdp();
    long long l,r;
    while ( ~scanf("%lld%lld",&l,&r) )
    {
        long long ans = solve(r) - solve(l-1);
        printf("%lld\n",ans);
    }
    return 0;
}
<后记>
『月之谜 数位dp』的更多相关文章
- 『The Counting Problem 数位dp』
		
The Counting Problem Description 求 [L,R]内每个数码出现的次数. Input Format 若干行,一行两个正整数 L 和 R. 最后一行 L=R=0,表示输入结 ...
 - $BZOJ1799\ Luogu4127$ 月之谜 数位统计$DP$
		
AcWing Description Sol 看了很久也没有完全理解直接$DP$的做法,然后发现了记搜的做法,觉得好棒! 这里是超棒的数位$DP$的记搜做法总结 看完仿佛就觉得自己入门了,但是就像 ...
 - 『树上匹配 树形dp』
		
树上匹配 Description 懒惰的温温今天上班也在偷懒.盯着窗外发呆的温温发现,透过窗户正巧能看到一棵 n 个节点的树.一棵 n 个节点的树包含 n-1 条边,且 n 个节点是联通的.树上两点之 ...
 - 『土地征用  Land Acquisition 斜率优化DP』
		
斜率优化DP的综合运用,对斜率优化的新理解. 详细介绍见『玩具装箱TOY 斜率优化DP』 土地征用 Land Acquisition(USACO08MAR) Description Farmer Jo ...
 - 『摆渡车 斜率优化dp及总结』
		
摆渡车的题解我已经写过一遍了,在这里,这次主要从斜率优化的角度讲一下摆渡车,并总结一下斜率优化会出现的一些奇奇怪怪的错误. 摆渡车 Description 有 n 名同学要乘坐摆渡车从人大附中前往人民 ...
 - Nescafé2 月之谜 题解
		
月之谜 (mystery.pas/c/cpp) [题目描述] 打败了 Lord lsp 之后,由于 lqr 是一个心地善良的女孩子,她想净化 Lord lsp 黑化的心,使他变回到原来那个天然呆的 l ...
 - AcWing 311 .月之谜
		
大型补档补了一年 题目链接 考虑枚举月之数的数列和,然后展开dp预处理 设当前模数为 \(P\) \(f[i][j][k]\) 表示一共有 i 位数字,数位和为 j,数值和 % P 的值为 K \(f ...
 - 【BZOJ1662】[Usaco2006 Nov]Round Numbers 圆环数 数位DP
		
[BZOJ1662][Usaco2006 Nov]Round Numbers 圆环数 Description 正如你所知,奶牛们没有手指以至于不能玩"石头剪刀布"来任意地决定例如谁 ...
 - bzoj1026数位dp
		
基础的数位dp 但是ce了一发,(abs难道不是cmath里的吗?改成bits/stdc++.h就过了) #include <bits/stdc++.h> using namespace ...
 
随机推荐
- java Integer中隐藏的细节魔鬼!来自面试官的三轮暴击!
			
1 第一波暴击!!! 程序员比较实在,一般会说: 那就先上代码 package com.example.demo; public class TestInteger { public static v ...
 - Java开发桌面程序学习(一)——JavaFx+Jfoenix初始以及搭建
			
Java开发桌面程序学习(一)--JavaFx+Jfoenix初始以及搭建 前言 想做一个Java的桌面程序,但是,使用原生的Swing感觉又十分麻烦,那个布局都是拿代码设置,看着十分的乱,偶然的情况 ...
 - PDF目录编辑器使用介绍
			
PDF目录编辑器使用介绍 魏刘宏 2019.06.28 PDF 是一个比较优秀的文档格式,能够保证在任何终端显示的样式是一样的.但同时也带来了一个问题,就是编辑不方便,其实这也是这个格式特意为之的,无 ...
 - C# Newtonsoft.Json 读取文件,返回json字符串
			
第一种方法: public object getData2() { string content; using (StreamReader sr = new StreamReader(Server.M ...
 - java核心技术第六篇之断言、日志、包装类型和工具类
			
JDK1.5新特性: 1.自动拆装箱. 2.泛型 3.可变参数 4.静态导入 5.增强for循环 6.互斥锁 7.枚举 8.注解 JDK1.6新特性: 1.Desktop类和SystemTray类 2 ...
 - IOC控制反转、Unity简介
			
参考博客地址: Unity系列文章,推荐:http://www.cnblogs.com/qqlin/archive/2012/10/16/2717964.html https://www.cnblog ...
 - FCC---Animate Elements Continually Using an Infinite Animation Count---设置animation-iteration-count的次数为无限,让小球一直跳动
			
The previous challenges covered how to use some of the animation properties and the @keyframes rule. ...
 - 推荐一款适合Dynamics 365/Dynamics CRM 2016 使用的弹出窗插件AlertJs
			
Github地址: https://github.com/PaulNieuwelaar/alertjs 目前有两个版本,3.0版本(30天免费试用)以及2.1版本(完全免费) ------------ ...
 - python获得多个输入值
			
我们都知道python的input()函数是以字符串的形式输入的,这就产生了一个问题:当我们在一行内输入多个数值时,input()不会去判断输入元素个数,它只管把这行输入以字符串的形式输入,因此我们要 ...
 - tcp滑动窗口和读写缓冲区
			
最近突然忘记了 滑动窗口的原理,在网上找到了比较好的视频,现在在这里同大家分享: 注:反正进程间切换 视频链接: https://www.youtube.com/watch?v=R6ArbkVj-N8 ...