求调CF55D!!! WA ON TEST 8
  • 板块学术版
  • 楼主husy
  • 当前回复0
  • 已保存回复0
  • 发布时间2022/8/3 20:05
  • 上次更新2023/10/27 17:09:47
查看原帖
求调CF55D!!! WA ON TEST 8
484780
husy楼主2022/8/3 20:05

CF55D

#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
const int mod=2520; 
int t,b[mod+1];
long long f[25][mod+1][50],l,r;
vector<int>number;
void init()
{
	memset(f,-1,sizeof(f));
	int num=0;
	for(int i=1;i<=mod;i++)if(mod%i==0)b[i]=++num;
}
inline int gcd (int x,int y)
{
	if(x>y) swap(x,y);
	if(y%x==0) return x;
	return gcd(x,y%x);
}

int _lcm(int x,int y)
{
	return x*y/gcd(x,y);
}
long long dfs(int pos,int num_mod,int lcm,int sp)
{
	if(pos==-1)return num_mod%lcm==0;
	if(!sp&&f[pos][num_mod][b[lcm]]!=-1)return f[pos][num_mod][b[lcm]];
	int ans=0;
    int maxn=sp==1?number[pos]:9;
    for(int i=0;i<=maxn;i++)
    {
    	int nex_num_mod=(num_mod*10+i)%mod;
		int nex_lcm=lcm;
		if(i)nex_lcm=_lcm(nex_lcm,i);
		ans+=dfs(pos-1,nex_num_mod,nex_lcm,sp&&i==maxn) ;
	}
	if(sp==0)f[pos][num_mod][b[lcm]]=ans;
	return ans;
}
long long calc(long long x)
{
	number.clear();
	while(x)
	{
		number.push_back(x%10);
		x/=10;
	}
	return dfs(number.size()-1,0,1,1);
}
int main()
{
	init();
	cin>>t;
	while(t--)
	{
		cin>>l>>r;
		cout<<calc(r)-calc(l-1)<<endl;
	}
	return 0;
}
2022/8/3 20:05
加载中...