• 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
  • 相关阅读:
    面试算法爱好者书籍/OJ推荐
    go语言——数据类型
    go编程规范
    Go语言常见语法错误
    go语言入门
    python——itertools
    linux sed使用
    python——optparse模块
    Linux基本配置
    文件包含
  • 原文地址:https://www.cnblogs.com/i-caigou-TT/p/14377193.html
Copyright © 2020-2023  润新知