当前位置: 首页 > news >正文

CodeForces 628D(数位DP)

题意:

d-数:数字d有且只在偶数位上,奇数位不能出现数字d。(0<=d<=9),然后给定一个区间[L, R],问区间里面可以被m整除的d-数个数。(题意我抄网上的...)

思路:

L,R范围较大,用string模拟。

dp[i][j][k]:处理到第i位前对m取模为j且k表示忽略前导零之后i属于的位置是偶数位还是奇数位(暂时称作有效位)。


详情看代码:

#include <bits/stdc++.h>
#define LL long long
using namespace std;
const int maxn = 2005;
const int mod = 1e9+7;
LL ans, asa;
LL dp[maxn][maxn][2]; 
int m, d;
int wei[maxn];
string a, b;
string subtract(string s)
{
	if(s[0] == '0' && s.length() == 1) return "-";//a = 0使用'-'标记 
	--s[s.length()-1];
	for(int i = s.length()-1; i > 0; --i)
	{
		if(s[i] < '0') s[i] += 10, s[i-1] -= 1;
	}
	while(s.length() && s[0] == '0') s.erase(s.begin());
	if(!s.length()) return "0";
	return s;
}
LL dfs(int pos, int limit, int lead, int pre, int fact)
{
	if(pos == -1)
	{
		if(pre) return 0;	//最终模数不为0,不符合 
		if(lead && !d) return 0;	//一直都是前导零,当d不为0时满足 
		return 1;
	}
	if(!limit && !lead && dp[pos][pre][fact&1] != -1) return dp[pos][pre][fact&1];
	int up = limit? wei[pos]: 9;
	LL tmp = 0;
	if(fact&1)	//如果有效位为奇(从0开始的,奇表示的偶数位) 
	{
		//那么此时该位必须为d 
		if(up >= d) tmp += dfs(pos-1, limit&&d==wei[pos], lead&&d==0, (pre*10+d)%m, fact+1);
		tmp %= mod;
	}
	else	//有效位为偶则在可取范围内取任意一个不等于d的值 
	{
		for(int i = 0; i <= up; ++i)
		{
			if(lead && i == 0) //之前都为前导零则再取零则有效位仍然为0 
			{
				tmp += dfs(pos-1, limit&&i==wei[pos], lead, 0, 0);
				tmp %= mod;
			}
			else
			{ 
				if(i == d) continue;	//取不等于d的值 
				tmp += dfs(pos-1, limit&&i==wei[pos], lead&&i==0, (pre*10+i)%m, fact+1);
				tmp %= mod;
			}
		}
	}
	if(!limit && !lead) dp[pos][pre][fact&1] = tmp;
	return tmp;
}
LL solve(string s)
{
	int pos = 0;
	if(s[0] == '-') return 0;
	for(int i = s.length()-1; i >= 0; --i) wei[pos++] = s[i]-'0';
	return dfs(pos-1, 1, 1, 0, 0);
}
int main()
{
	ios::sync_with_stdio(0);
	memset(dp, -1, sizeof dp);
	cin >> m >> d;
	cin >> a >> b;
	a = subtract(a);//模拟a-1; 
	cout << ((solve(b)-solve(a)+mod)%mod) << endl;
	//防止取模之后相减为负数 
	return 0;
}

继续加油~

相关文章:

  • 多重背包--二进制优化
  • JS高级程序设计2nd部分知识要点2
  • HDU-4549(矩阵快速幂+欧拉定理)
  • xcode Aborting commit: '~/Pods' remains in tree-conflict 错误的解决办法
  • 网络流之最大流(FF, EK, Dinic, SAP)
  • QDU-ycb的ACM进阶之路(多重背包做法)
  • 2017年第0届浙江工业大学之江学院程序设计竞赛决赛—B qwb与矩阵
  • F5 LTM 在SIP消息负载均衡中存在的问题
  • 2017年第0届浙江工业大学之江学院程序设计竞赛决赛—D qwb与神奇的序列
  • 我所爱的世界
  • 2017年第0届浙江工业大学之江学院程序设计竞赛决赛—J qwb又偷懒了
  • 字符串处理文章outline
  • 2017年第0届浙江工业大学之江学院程序设计竞赛决赛—K qwb与小数
  • java内存管理机制
  • 网络流-割的概念以及定理
  • [Vue CLI 3] 配置解析之 css.extract
  • 「译」Node.js Streams 基础
  • Android系统模拟器绘制实现概述
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • SAP云平台里Global Account和Sub Account的关系
  • supervisor 永不挂掉的进程 安装以及使用
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • 阿里研究院入选中国企业智库系统影响力榜
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 当SetTimeout遇到了字符串
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 分类模型——Logistics Regression
  • 使用parted解决大于2T的磁盘分区
  • 使用putty远程连接linux
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • 我建了一个叫Hello World的项目
  • 主流的CSS水平和垂直居中技术大全
  • Android开发者必备:推荐一款助力开发的开源APP
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (07)Hive——窗口函数详解
  • (145)光线追踪距离场柔和阴影
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (2020)Java后端开发----(面试题和笔试题)
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (poj1.2.1)1970(筛选法模拟)
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (一)基于IDEA的JAVA基础1
  • .NET Core6.0 MVC+layui+SqlSugar 简单增删改查
  • .net 反编译_.net反编译的相关问题
  • .NetCore 如何动态路由
  • .NET连接MongoDB数据库实例教程
  • /proc/interrupts 和 /proc/stat 查看中断的情况
  • @Autowired多个相同类型bean装配问题
  • @DataRedisTest测试redis从未如此丝滑
  • @FeignClient注解,fallback和fallbackFactory
  • @for /l %i in (1,1,10) do md %i 批处理自动建立目录
  • @拔赤:Web前端开发十日谈
  • [ C++ ] STL---stack与queue