求助!只T了第六个点……
查看原帖
求助!只T了第六个点……
65743
滑稽的小宫楼主2020/7/31 07:21

RT

#include<iostream>
#include<cstdio>
#include<algorithm>
#define ll long long
ll a,b,k,lkn[10010],nxt[10010],ansa,ansb,fr[10010];
ll gcd(ll x,ll y){
	if(!y)return x;
	return gcd(y,x%y);
}ll lcm(ll x,ll y){
	return y/gcd(x,y)*x;
}
void find(ll num){
	if(num>b)return;
	if(num)lkn[++k]=num;
	find(num*10+6);
	find(num*10+8);
	return;
}void dfs(int s,int cnt,ll l,ll n,ll &ans){
	if(l>b)return;
	if(s>k){
		if(!cnt)return;
		if(cnt&1)ans+=n/l;
		else ans-=n/l;
		return;
	}
	dfs(nxt[s],cnt,l,n,ans);
	dfs(nxt[s],cnt+1,lcm(l,lkn[s]),n,ans);
	return;
}
int main(){
	scanf("%lld%lld",&a,&b);
	find(0);
	std::sort(lkn+1,lkn+k+1,std::greater<ll>());
	int st=1;
	for(int i=1;i<=k;i++){
		nxt[i]=i+1;
	}
	for(int i=k;i>=1;i--){
		for(int j=k;j>i;j--){
			if(!(lkn[i]%lkn[j])){
				nxt[i-1]=nxt[i];
				break;
			}
		}
	}int last=0;
	for(int i=0;i<=k;i=nxt[i])fr[i]=last,last=i;
	for(int i=k;i>=1;i=fr[i]){
		if(lkn[i]>b/2){
			nxt[fr[i]]=nxt[i];
			ansb+=b/lkn[i];
			ansa+=a/lkn[i];
		}
	}
	if(a!=1)dfs(nxt[0],0,1,--a,ansa);
	dfs(nxt[0],0,1,b,ansb);
	printf("%lld",ansb-ansa);
	return 0;
}

2020/7/31 07:21
加载中...