样例过了,但是有hack过不去
查看原帖
样例过了,但是有hack过不去
291604
王茗仟楼主2022/11/21 17:20
#include<bits/stdc++.h>
#define double long double
#define int128 __int128
#define int long long
#define re register
#define in inline
#define Pi pair<int,int>
#define vi vector<int>
#define max(a,b)  ((a)>(b)?a:b)
#define min(a,b)  ((a)<(b)?a:b)
#define ls x<<1
#define rs x<<1|1
#define dx i+xx[k]
#define dy j+yy[k]
#define debug cout<<"wuyu"<<endl;
using namespace std;
const int INF=0x3f3f3f3f;
const int N=1e6+19;
const int M=1e6+10;
const double eps=1e-5;
in int read(){	re int x=0,f=0;re char c=getchar();	while(!isdigit(c)) f|=(c=='-'),c=getchar();	while(isdigit(c))  x=(x<<3)+(x<<1)+c-'0',c=getchar();	return f?-x:x;}
in void write(re int x){	if(x<0) putchar('-'),x=-x;	if(x>9) write(x/10);	putchar(x%10+'0');}


int f[2][20][50][2521];
int b[50];
int d[2521];
int a[20];


int gcd(int a,int b){
	if(b==0) return a;
	return gcd(b,a%b);
}

void init(){
	int x=2520;
	for(int i=1;i<=2520;i++){
		if(x%i==0){
			b[++b[0]]=i;
			d[i]=b[0];
		}
	}
	
	b[0]=1;
}


int dfs(int less,int dep,int l,int mod){
	if(!dep) return (mod%b[l]==0);
//	if(~f[less][dep][l][mod]) return f[less][dep][l][mod];
	int ret=0;
	int ed= (less) ? 9:a[dep];
	for(int i=0;i<=ed;i++){
		ret+=dfs(less||(i<ed),dep-1,d[i*b[l]/gcd(i,b[l])],(mod*10+i)%2520);
	}
//	f[less][dep][l][mod]=ret;
	return ret;
}
/*d[b[i]]==i
2520*/

int work(int n){

	a[0]=0;
	while(n){
		a[++a[0]]=n%10;
		n/=10;
	}
/*	for(int i=a[0];i>=1;i--){
		cout<<a[i];
	}
	cout<<endl;*/
	memset(f,-1,sizeof(f));
	
	return dfs(0,a[0],0,0);
}


signed main(){
	int T;
	T=read();
	init();
	
	while(T--){
		int L,R;
		L=read();R=read();
		
		cout<<work(R)-work(L-1)<<endl;
	}
	return 0;
	
	
}


对于 1

1 1000 的输入我的输出是 227

答案是 138

2022/11/21 17:20
加载中...