社区讨论

萌新求教,时间复杂度应该是对的啊,为何tle

CF55DBeautiful numbers参与者 16已保存回复 17

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
17 条
当前快照
1 份
快照标识符
@mi6ue5zl
此快照首次捕获于
2025/11/20 10:58
4 个月前
此快照最后确认于
2025/11/20 14:35
4 个月前
查看原帖
CPP
#include <iostream>
#include <cctype>
#include <cstdio>
#include <cstring>

using namespace std;

int cas;

long long read()
{
	long long x=0;char ch=getchar();
	while (!isdigit(ch))ch=getchar();
	while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}
	return x;
}

char out[2000050],*o=out;

void print(long long x)
{
    char buf[23],*b=buf;
    if(!x)*b++=48;
    while(x)*b++=x%10+48,x/=10;
    while(b--!=buf)*o++=*b;
    *o++='\n';
}

long long gcd(long long a,long long b)
{
	return (!b)?a:gcd(b,a%b);
}

long long lcm(long long a,long long b)
{
	if (a==0) return b;
	if (b==0) return a;
	return a*b/gcd(a,b);
}

int dig[20];

long long dp[20][2525][55];

int idx[2525],cnt=0;

long long dfs(long long n,long long r,long long c,bool flag)
{
	//cout << n << " " << r << " " << c << " " << flag << endl;
	if (n==0)
		return r%c==0;
	int tmp=idx[c];
	if (dp[n][r][tmp]!=-1 && !flag)
		return dp[n][r][tmp];
	long long ret=0;
	int ub=flag?dig[n]:9;
	for (int i=0;i<=ub;i++)
		ret+=dfs(n-1,(10*r+i)%2520,lcm(c,i),flag && i==ub);
	if (!flag)
		dp[n][r][tmp]=ret;
	return ret;
}

long long Count(long long a)
{
	int len=0;
	while (a)
	{
		dig[++len]=a%10;
		a/=10;
	}
	return dfs(len,0,1,true);
}

void Init()
{
	for (int i=1;i<=2520;i++)
		if (2520%i==0)
			idx[i]=++cnt;
}

int main()
{
	Init();
	cas=read();
	while (cas--)
	{
		long long l,r;
		cin >> l >> r;
		memset(dp,-1,sizeof(dp));
		long long R=Count(r);
		//memset(dp,-1,sizeof(dp));
		long long L=Count(l-1);
		cout << R-L << endl;
	}
	return 0;
}

回复

17 条回复,欢迎继续交流。

正在加载回复...