求l,r之间能被除0以外的自己的每一个数位整除的数。
这道题和之前有一道挺像,其实10以内的数质因子只有2357,所以看这四个的最大数量就行,同时最小公倍数是2520,所以原数可以对这个取模。
dp[x][st][c2][c3][c5][c7]表示前x位,原数st,2357最大数量为…….
下附代码:
1 #include<bits/stdc++.h> 2 #define ll unsigned long long 3 using namespace std; 4 const ll MOD=2520; 5 ll dim[20]; 6 ll dp[20][2525][4][3][2][2]; 7 ll qpow(ll a,ll b){ 8 ll ret=1; 9 while (b){ 10 if (b&1) ret=ret*a; 11 a=a*a; 12 b>>=1; 13 } 14 return ret; 15 } 16 ll judge2(ll x){ 17 if (x==2) return 1; 18 if (x==6) return 1; 19 if (x==4) return 2; 20 if (x==8) return 3; 21 return 0; 22 } 23 ll judge3(ll x){ 24 if (x==3) return 1; 25 if (x==6) return 1; 26 if (x==9) return 2; 27 return 0; 28 } 29 ll judge5(ll x){ 30 if (x==5) return 1; 31 return 0; 32 } 33 ll judge7(ll x){ 34 if (x==7) return 1; 35 return 0; 36 } 37 ll dfs(int x,ll st,ll c2,ll c3,ll c5,ll c7,int jb){ 38 if (!x){ 39 ll tmp=qpow(2,c2)*qpow(3,c3)*qpow(5,c5)*qpow(7,c7); 40 // printf("%d %d %d %d %d ",st,c2,c3,c5,c7); 41 return (st%tmp==0); 42 } 43 if (!jb && dp[x][st][c2][c3][c5][c7]!=-1) return dp[x][st][c2][c3][c5][c7]; 44 ll ret=0; 45 int maxn=9; 46 if (jb) maxn=dim[x]; 47 for (int i=0; i<=maxn; i++){ 48 ret+=dfs(x-1,(st*10%2520+i)%2520,max(c2,judge2(i)),max(c3,judge3(i)),max(c5,judge5(i)),max(c7,judge7(i)),(jb==1 && maxn==i)); 49 } 50 if (!jb) return dp[x][st][c2][c3][c5][c7]=ret; 51 return ret; 52 } 53 int main(){ 54 memset(dp,-1,sizeof(dp)); 55 int T; 56 scanf("%d",&T); 57 while (T--){ 58 ll l,r; 59 scanf("%I64d%I64d",&l,&r); 60 l--; 61 int len=0; 62 while (l){ 63 dim[++len]=l%10; 64 l/=10; 65 } 66 ll resl=dfs(len,0,0,0,0,0,1); 67 len=0; 68 while (r){ 69 dim[++len]=r%10; 70 r/=10; 71 } 72 ll resr=dfs(len,0,0,0,0,0,1); 73 printf("%I64d ",resr-resl); 74 } 75 }