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[