TLE #11 调好久了 代码不长 求大佬帮忙看看
查看原帖
TLE #11 调好久了 代码不长 求大佬帮忙看看
308384
Morpheuse楼主2021/11/16 20:27
#include<bits/stdc++.h>
using namespace std;
#define mod 2520
#define maxn 2600

typedef long long ll;

ll f[30][49][maxn];
ll t,l,r;

int len;
int a[30],b[maxn],tot;
int gcd(int x , int y)
{
	return y == 0 ? x : gcd(y , x % y);
}
inline int Lcm(int x , int y)
{
	return x * y / gcd(x , y);
}
ll dfs(int lim , int pos , int lcm , int yu)
{
	if(pos > len) return (yu % lcm == 0);
	if(lim == 0 && f[pos][b[lcm]][yu] != -1) return f[pos][b[lcm]][yu];
	int res = lim ? a[len - pos + 1] : 9;
	int k = lcm;
	ll cnt = 0;
	for(int i = 0 ; i <= res ; ++ i)
	{
		if(i) k = Lcm(lcm , i);
		cnt += dfs(i == res && lim , pos + 1 , k , (yu * 10 + i) % mod);
	}
	return lim ? cnt : f[pos][b[lcm]][yu] = cnt;
}

ll s(ll x)
{
	len = 0;
	memset(a , 0 , sizeof(a));
	while(x) a[++ len] = x % 10 , x /= 10;
	return dfs(1 , 1 , 1 , 0);
}

int main()
{
	scanf("%lld", &t);

	memset(f , -1 , sizeof(f));
	for(int i = 1 ; i <= mod ; ++ i)
		if(mod % i == 0)
			b[i] = ++ tot;
	while(t --)
	{
		
		scanf("%lld%lld", &l,&r);
		printf("%lld\n", s(r) - s(l - 1));
	}
}
2021/11/16 20:27
加载中...