1. 程式人生 > >Beautiful numbers CodeForces

Beautiful numbers CodeForces

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
const int MOD = 2520;
int Hash[3000];
int digit[50];
ll dp[50][2530][50];
void init(){
    int cnt = 0;
    for(int i = 1; i <= MOD; i++){
        if(MOD % i == 0)
            Hash[i] = cnt++;
    }
}
ll gcd(ll a,ll b){
    if(!b)
        return a;
    else return gcd(b,a%b);
}
ll dfs(int pos,int num,int lcm,int limit){
    if(pos == -1)
        return num % lcm == 0;
    ll &dpnow = dp[pos][num][Hash[lcm]];
    if(!limit && dpnow != -1)
        return dpnow;
    int max_digit = limit ? digit[pos] : 9;
    ll ans = 0;
    for(int i = 0; i <= max_digit; i++){
        ans += dfs((pos - 1), ((num * 10 + i) % MOD), (!i ? lcm : lcm * i / gcd(lcm,i)), (limit && i == max_digit));
    }
    if(!limit) dpnow = ans;
    return ans;
}
ll solve(ll n){
    int pos = 0;
    while(n){
        digit[pos++] = n % 10;
        n /= 10;
    }
    return dfs(pos-1,0,1,1);
}
int main(){
    init();
    int t;
    cin >> t;
    memset(dp,-1,sizeof(dp));
    while(t--){
        ll l,r;
        cin >> l >> r;
        cout << solve(r) - solve(l-1) << endl;
    }
    return 0;
}