[NOIP模拟][数位DP]魔法数字

ASDFZ-NOIP2016模拟
题目
这里写图片描述
分析
题解分析:
设p = LCM(q1, q2, q3 … qn),则任意数 s = t * p + r (r < p),很容易推导出:s % qi = r % qi,也就是说只要我们知道一个数模 p 的余数,就能得到它模q1, q2, q3 … qn 的余数。 对于本题而言,p = LCM(1, 2, 3,4, 5, 6, 7, 8, 9) = 2520。我们先把[L, R]的问题转化为[0, R]的问题与[0, L - 1]问题的差值。而[0, x]的问题容易用数位DP解决,我们只需从高位到低位,状态记录当前在哪一位、前面的位数是否与 x相等、9 个数分别是否出现、模 p 的值即可。时间复杂度 O(10 * 2^9 * logR / log10 * 2520)。 (不了解该性质也可以直接应用最小表示法解决) 一个可行的优化:当我们知道尚未加入最后一位前的数模1、 2、3、4、6、7、9 的值时,是否为5 或8的倍数只和最后一位有关,如此可以把状态中的2520 压到252。
自己的分析:
这道题的暴力还是很好拿的。正解的话,首先那个所谓的可行优化貌似是必须的,因为不这样过不了所有点。正解的记忆化搜索让它的复杂度大大下降。而且个人认为8应该是后三位有关系,因为2520>1000,所以不影响。详解见代码注释。

附代码

#include<iostream>
#include<cstring>
#include<string>
#include<cstdlib>
#include<cstdio>
#include<ctime>
#include<queue>
#include<iomanip>
#include<set>
#include<cctype>
#include<ctime>
#include<algorithm>
using  namespace std;

int k;
long long l,r,ans,bit[
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值