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;
}
原文地址:https://www.cnblogs.com/fish7/p/4311981.html