博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CodeForces 258B Little Elephant and Elections :于1-m中找出七个数,使六个数里面的4和7个数比第七个数严格小:数位dp+dfs...
阅读量:5767 次
发布时间:2019-06-18

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

预处理sum数组,sum[i]表示1-m中有i个4或7的数有多少个,这个数位dp很好写

然后就是枚举第七个数含有的4,7数目,dfs剩下的六个数=

1 #include
2 #include
3 #include
4 using namespace std; 5 #define LL long long 6 #define MOD 1000000007 7 LL num[15],dp[15][15][15],sum[15]; 8 LL dfs(LL pos,LL pre,LL sum,LL limit) 9 {10 LL ans=0;11 if (pos==0) return pre==sum;12 if (!limit&&dp[pos][pre][sum]!=-1) 13 return dp[pos][pre][sum];14 LL tmp=limit?num[pos]:9,i;15 for (i=0;i<=tmp;i++)16 ans+=dfs(pos-1,pre+(i==4||i==7),sum,limit&&i==tmp);17 if (!limit) dp[pos][pre][sum]=ans;18 return ans;19 }20 LL solve(LL now,LL res)21 {22 LL ans=0,i;23 if (now==7) return 1;24 for (i=0;i<=res;i++)25 if (sum[i]>0)26 {27 sum[i]--;28 ans=(ans+(sum[i]+1)*solve(now+1,res-i))%MOD;29 sum[i]++;30 }31 return ans;32 }33 int main()34 {35 LL m,cnt=0,ans=0,i;36 scanf("%I64d",&m);37 memset(dp,-1,sizeof(dp));38 while (m){39 num[++cnt]=m%10;40 m/=10;41 }42 for (i=0;i<=cnt;i++) sum[i]=dfs(cnt,0,i,1); sum[0]--;43 for (i=1;i<=cnt;i++)44 ans=(ans+sum[i]*solve(1,i-1))%MOD;45 printf("%I64d\n",ans);46 return 0;47 }
View Code

题目链接:

转载于:https://www.cnblogs.com/xiao-xin/articles/4367102.html

你可能感兴趣的文章
android超链接
查看>>
redhat tomcat
查看>>
统计数据库大小
查看>>
IO流的学习--文件夹下文件的复制
查看>>
第十六章:脚本化HTTP
查看>>
EXCEL表中如何让数值变成万元或亿元
查看>>
Cisco PIX防火墙的安装流程
查看>>
配置系列:ssm中applicationContext-mybatis.xml的简单配置
查看>>
mysql或者mariadb备份脚本
查看>>
extundelete恢复文件
查看>>
电池温度检测原理和示例代码
查看>>
Linux服务器性能评估与优化、监控利器---dstat应用
查看>>
hdu 2842 Chinese Rings 矩阵快速幂
查看>>
Powershell进阶学习(4) Powershell强大的利器“管道”
查看>>
关于GNU GPL
查看>>
request.getServletPath()和request.getPathInfo()用法
查看>>
nginx在响应request header时候带下划线的需要开启的选项
查看>>
Linux下DHCP服务器配置
查看>>
AndroidStudio中导入SlidingMenu报错解决方案
查看>>
我的IDEA配置
查看>>