Beautiful numbers CodeForces
阿新 • • 發佈:2019-02-14
#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; }