zoukankan      html  css  js  c++  java
  • hdu 5179 beautiful number(构造,,,,)

    题意:

    一个如果称作是漂亮数,当且仅当满足:

    每一位上的数字是【1,9】,从高到时低数字大小降序,且有di%dj=0(i<j) 例:931

    给一个区间【L,R】,问这个区间里有多少个漂亮数。

    1LR109

    思路:

    漂亮数一看就很少。可以直接构造。

    哎,,,用了DP+构造,写了好久。。。其实很简单的一个DFS构造就行了。

    过些天补上代码。先贴冗长代码~

    代码:

    int T,L,R;
    int wei;
    int ans1,ans2,ans;
    int d[15], w[15];
    int dp[15][15];
    
    
    
    int calc(int x){
        int cn=0;
        while(x){
            x/=10;
            ++cn;
        }
        return cn;
    }
    
    void dfs(int pos,bool state){
        if(pos>wei){
            ++ans;
            return;
        }
        if(pos==1){
            if(state){
                rep(i,1,d[pos]){
                    w[pos]=i;
                    dfs(pos+1,i==d[pos]);
                }
            }else{
                rep(i,1,9){
                    w[pos]=i;
                    dfs(pos+1,state);
                }
            }
        }else{
            if(state){
                rep(i,1,d[pos]){
                    if(w[pos-1]%i==0){
                        w[pos]=i;
                        dfs(pos+1,i==d[pos]);
                    }
                }
            }else{
                rep(i,1,9){
                    if(w[pos-1]%i==0){
                        w[pos]=i;
                        dfs(pos+1,state);
                    }
                }
            }
        }
    }
    
    
    
    int main(){
    
        cin>>T;
        while(T--){
            scanf("%d%d",&L,&R);
    
            L--;
            int tempL=L;
            wei=calc(L);
            rep2(i,wei,1){
                d[i]=(L%10);
                L/=10;
            }
            ans=0;
            if(tempL==0){
                ans=0;
            }else{
                dfs(1,true);
            }
            ans1=ans;
    
            mem(dp,0);
            rep(i,1,9) dp[1][i]=1;
            rep(i,2,wei-1){
                rep(j,1,9){
                    rep(k,1,9){
                        if(j%k==0){
                            dp[i][j]+=dp[i-1][k];
                        }
                    }
                }
            }
            rep(i,1,wei-1){
                rep(j,1,9) ans1+=dp[i][j];
            }
    
    
    
    
            wei=calc(R);
            rep2(i,wei,1){
                d[i]=(R%10);
                R/=10;
            }
            ans=0;
            dfs(1,true);
            ans2=ans;
    
            mem(dp,0);
            rep(i,1,9) dp[1][i]=1;
            rep(i,2,wei-1){
                rep(j,1,9){
                    rep(k,1,9){
                        if(j%k==0){
                            dp[i][j]+=dp[i-1][k];
                        }
                    }
                }
            }
            rep(i,1,wei-1){
                rep(j,1,9) ans2+=dp[i][j];
            }
    
    
            printf("%d
    ",ans2-ans1);
        }
    
        return 0;
    }
  • 相关阅读:
    Antd表格跨行
    Echarts使用记录
    PAT甲级刷题实录——1010
    PAT甲级刷题实录——1009(写文章时又想到了改进方法)
    PAT甲级刷题实录——1008
    PAT甲级刷题实录——1007
    PAT甲级刷题实录——1006
    PAT甲级刷题实录——1005
    PAT甲级刷题实录——1004
    PAT甲级刷题实录——1003
  • 原文地址:https://www.cnblogs.com/fish7/p/4311981.html
Copyright © 2011-2022 走看看