TLE #8 求助
查看原帖
TLE #8 求助
1059747
longlong_int楼主2025/1/30 21:23

本地 2s 过了,放 CF 上四秒跑不过 :(

#include <bits/stdc++.h>
#define endl '\n'
typedef long long ll;
using namespace std;

inline ll read()
{
    ll f = 1, sum = 0; char c = getchar();
    while (!(48 <= c && c <= 57)) { if (c == '-') f = -1; c = getchar();}
    while (48 <= c && c <= 57){sum = sum * 10 + c - 48; c = getchar();}
    return sum * f;
}

inline void write(ll x)
{
    if (x < 0) putchar('-'), x = -x;
    if (x > 9) write(x / 10); putchar(x % 10 + 48);
}

int ys2[2521];
vector<int> arr;
ll dp[20][50][2521];

ll gcd(ll a, ll b)
{
    if (a % b == 0) return b;
    return gcd(b, a % b);
}

ll calc_lcm(ll a, ll b)
{
    if (!b) return a;
    if (!a) return b;
    return a / gcd(a, b) * b;
}

ll dfs(ll pos, int lcm, ll mod, bool flag2)
{
    if (pos == 0) return mod % lcm == 0;
    if (!flag2 && dp[pos][ys2[lcm]][mod]) return dp[pos][ys2[lcm]][mod];
    int r = flag2 ? arr[pos] : 9;
    ll tot = 0;
    for (int i = 0; i <= r; i++)
    {
        tot += dfs(pos - 1, calc_lcm(lcm, i), (mod * 10 + i) % 2520, flag2 && (i == r));
    }
    if (!flag2) dp[pos][ys2[lcm]][mod] = tot;
    return tot;
}

ll solve(ll k)
{
    arr.clear();
    arr.push_back(-1);
    while (k) arr.push_back(k % 10), k /= 10;
    return dfs(arr.size() - 1, 1, 0, 1);
}

int main()
{
    int t;
    cin >> t;
    int cur = 0;
    for (int i = 1; i <= 2520; i++)
    {
        if (2520 % i == 0)
        {
            ys2[i] = ++cur;
        }
    }
    while (t--) 
    {
        ll l, r;
        cin >> l >> r;
        cout << solve(r) - solve(l - 1) << endl;
    }
    return 0;
}
2025/1/30 21:23
加载中...