решение проблемы
Некоторые из них могут быть число делится, то это должно быть это число \ (LCM \) делится
Таким образом , мы склонны думать , в соответствии с \ (LCM \) установить состояние
Мы могли бы найти это полезным \ (LCM \) только \ (48 \) а ,
Ну, в соответствии со средним числом бит \ (дп \)
Установка состояния: \ (Р- {. I, J, К, 0/1} \) , представляющий вперед \ (I \) бит, \ (LCM = J \) , умирают \ (LCM \) остатка является \ (K \ ) , будь то верхняя граница
Но этот способ не может быть передана (из-за количества вновь добавленного модуля может произвести изменения)
Таким образом , мы объединены в модуль \ (2520 \)
Сложность \ (О (Т * L * 48 * 2500 * 2) \)
В котором \ (L \) является количество входных битов
Тогда это будет \ (TLE \)
Считайте это небольшая оптимизация.
Поскольку несколько наборов вопросов.
Если вы задали большое количество,
На этот раз действительно задает много ответов мы уже знаем.
Мы можем избавиться от состояния \ (01 \) , что измерение.
Такая сложность может удалить номер группы спросила.
См конкретного второго кода.
Код
int gcd(int x, int y) {
return !y ? x : gcd(y, x % y);
}
int lcm(int x, int y) {
if (!x || !y) return x | y;
return x * y / gcd(x, y);
}
LL dfs(int x, int n, int m, int op) {
if (!x) return !num[n] || m % num[n] == 0;
if (f[x][n][m][op] != -1) return f[x][n][m][op];
LL &res = f[x][n][m][op]; res = 0;
for (int i = 0; i <= (op ? a[x] : 9); i++)
res += dfs(x - 1, M[lcm(num[n], i)], (m * 10 + i) % 2520, op & i == a[x]);
return res;
}
LL calc(LL x) {
if (!x) return 1;
l = 0;
while (x) a[++l] = x % 10, x /= 10;
for (int i = 1; i <= l; i++)
memset(f[i], -1, sizeof(f[i]));
return dfs(l, 0, 0, 1);
}
void solve() {
LL l = gi<LL>(), r = gi<LL>();
printf("%lld\n", calc(r) - calc(l - 1));
return ;
}
int main() {
for (int i = 1; i < (1 << 9); i++) {
int d = 0;
for (int j = 0; j < 9; j++)
if (i >> j & 1)
d = lcm(d, j + 1);
if (!M[d]) num[++cnt] = d, M[d] = cnt;
}
int T = gi<int>();
while (T--) solve();
return 0;
}
LL dfs(int x, int n, int m, int op) {
if (!x) return !num[n] || m % num[n] == 0;
if (!op && f[x][n][m] != -1) return f[x][n][m];
LL res = 0;
for (int i = 0; i <= (op ? a[x] : 9); i++)
res += dfs(x - 1, M[lcm(num[n], i)], (m * 10 + i) % 2520, op & i == a[x]);
if (!op) f[x][n][m] = res;
return res;
}