cf55d

求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 }
View Code
原文地址:https://www.cnblogs.com/i-caigou-TT/p/14377193.html