萌新求教,时间复杂度应该是对的啊,为何tle
查看原帖
萌新求教,时间复杂度应该是对的啊,为何tle
238572
神山识楼主2020/7/30 12:00
#include<bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
const int P=2520;long long l,r,dp[25][2525][55][2][2];int T,cnt=0,tot=0,a[25],xd[25],t[2525];
inline int gcd(int a,int b) {return a&&b?gcd(b,a%b):a+b;}
inline void A(int x) {xd[++tot]=x,t[x]=tot;}
inline int Q(int x,int q) {int r=1;for(;q;q>>=1,x*=x) if(q&1) r*=x;return r;}
long long dfs(int x,int s,int g,int lim,int zero)
{
	int ed;if(dp[x][s][t[g]][lim][zero]!=-1) return dp[x][s][t[g]][lim][zero];else dp[x][s][t[g]][lim][zero]=0;
	if(x==0) {if(s%g==0) return dp[x][s][t[g]][lim][zero]=1;else return dp[x][s][t[g]][lim][zero]=0;}else ed=lim?a[x]:9;
	for(int i=0;i<=ed;i++) dp[x][s][t[g]][lim][zero]+=dfs(x-1,(s*10+i)%P,i?(g*i/gcd(g,i)):g,lim&&i==ed,zero&&!i);
	return dp[x][s][t[g]][lim][zero];
}
inline long long solve(register long long x)
{
	for(cnt=0,memset(dp,-1,sizeof(dp));x;x/=10) a[++cnt]=x%10;
	return dfs(cnt,0,1,1,1);
}
signed main()
{
	for(int _2=0;_2<=3;_2++) for(int _3=0;_3<=2;_3++) for(int _5=0;_5<=1;_5++) for(int _7=0;_7<=1;_7++) A(Q(2,_2)*Q(3,_3)*Q(5,_5)*Q(7,_7));
	for(scanf("%d",&T);T--;) scanf("%lld%lld",&l,&r),printf("%lld\n",solve(r)-solve(l-1));
	return 0;
}

而且用了@Flying2018提供的不需要memset的做法后还是TLE。
本地也跑的特别满/kk

附:TLE的数据(请查看源码后食用
附:此贴题目来源

2020/7/30 12:00
加载中...