博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu 5179 beautiful number(构造,,,,)
阅读量:5076 次
发布时间:2019-06-12

本文共 2251 字,大约阅读时间需要 7 分钟。

题意:

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

每一位上的数字是【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\n",ans2-ans1);    }    return 0;}

 

转载于:https://www.cnblogs.com/fish7/p/4311981.html

你可能感兴趣的文章
CRC计算模型
查看>>
Ajax之404,200等查询
查看>>
Aizu - 1378 Secret of Chocolate Poles (DP)
查看>>
csv HTTP简单表服务器
查看>>
OO设计的接口分隔原则
查看>>
数据库连接字符串大全 (转载)
查看>>
java类加载和对象初始化
查看>>
对于负载均衡的理解
查看>>
django简介
查看>>
window.event在IE和Firefox的异同
查看>>
常见的js算法面试题收集,es6实现
查看>>
IO流写出到本地 D盘demoIO.txt 文本中
查看>>
Windows10 下Apache服务器搭建
查看>>
HDU 5458 Stability
查看>>
左手坐标系和右手坐标系
查看>>
solr后台操作Documents之增删改查
查看>>
http://yusi123.com/
查看>>
文件文本的操作
查看>>
Ubuntu linux下gcc版本切换
查看>>
记一次Web服务的性能调优
查看>>