CF258B
CF258B
题意:
7个人在 $ [1,m] $ 区间内取数,求第一个人选的数的4和7的个数大于其他人的4和7个数总和的方案数。
解法:
要求输入的 $ m $ 可以很大,而且需要按位考虑每隔人的贡献,所以考虑数位DP。
设 $ f[i][j] $ 表示到第 $ i $ 位,有 $ j $ 个数是 $ 4 和 7 $ 的方案数,再利用dfs进行转移就行。
CODE :
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define LL long long
const LL MOD = 1e9+7;
LL final,dp[16][16],c[16];
int bit[16],l,cnt,tot,m;
int work(int m, int n) {
cnt = tot = l = 0;
for (; m; m /= 10) bit[++l] = m % 10;
for (int i = l; i && tot <= n; --i) {
for(int j = 0 ; j < bit[i] ; j++)
if (j == 4 || j == 7) {
if (tot < n) cnt += dp[i - 1][n - tot - 1];
} else cnt += dp[i - 1][n - tot];
if (bit[i] == 4 || bit[i] == 7) ++tot;
}
if(tot == n) ++cnt;
if(n == 0) --cnt;
return cnt;
}
void dfs(int t, int now, int lim, LL ans) {
if (t == 6) (final += ans) %= MOD;
else {
for (int i = 0; i <= 9 && i + now < lim; ++i)
if (c[i]) {
c[i]--;
dfs(t + 1, now + i, lim, ans * (c[i] + 1) % MOD);
c[i]++;
}
}
}
int main() {
scanf("%d", &m);
dp[0][0] = 1;
for(int i = 0 ; i <= 9 ; i++) {
for(int j = 0 ; j <= i ; j++) {
dp[i + 1][j + 1] += dp[i][j] * 2;
dp[i + 1][j] += dp[i][j] * 8;
}
}
for(int i = 0 ; i <= 9 ; i++) c[i] = work(m, i);
for(int i = 0 ; i <= 9 ; i++) {
if (c[i]) {
--c[i];
dfs(0, 0, i, (c[i] + 1) % MOD);
++c[i];
}
}
printf("%lld \n", final);
//system("pause");
return 0;
}
CF258B的更多相关文章
随机推荐
- hdu 1506 最大子矩阵面积
//写动态规划的题目 要把主要问题提炼出来 这里的问题就是求area=(j-k+1)*a[i] 如果找到j k是解决这个题目的关键 这里暴力求肯定是要超时的 这里用dp来优化 #include< ...
- winfrom_权限设置_TreeView的相关问题
1.获取TreeView的值: 循环TreeView,获取checked每个节点的Text,串起来用逗号“,”隔开,保存到数据库. List<string> list = new List ...
- IOS 跳转页面
1. 跳转界面,关闭自身 LoginViewController *loginViewController = [[LoginViewController alloc]initWithNibName: ...
- empty和isset的区别
1.empty 判断一个变量是否为空 null.false.0.0.0.’0′.array() .' '.var $a 都会返回true. 2.isset 判断一个变量是否设置 0.00.’0′. ...
- 禁止Steam VR随着虚幻4自动启动
1.禁止启动UE4的时候启动修改这个文件Program Files\Epic Games\XXXX\Engine\Plugins\Runtime\Steam\SteamVR\SteamVR.uplug ...
- Asp.net Core 微信小程序支付
最近要做一个微信小程序支付的功能 在网上找了一下 .net Core做微信支付的博客 和 demo 几乎没有 自己研究了好几天 参考了 很多 大牛的博客 勉强做出来了 因为参数都没有 比如 opid ...
- ABAP下载的病毒扫描Virus Scan
当我使用CL_HTTP_ENTITY=>IF_HTTP_ENTITY~GET_DATA从网络下载数据时,遇到异常CX_VSI: 错误原因是数据从网络下载到Netweaver服务器上之后,在服务器 ...
- TP5 用cron实现linux定时任务
TP5 用cron实现linux定时任务 1) tp5的控制器内容: namespace app\test\controller; use think\Controller; use think\fa ...
- OpenCV视觉处理核心课程
OpenCV视觉处理核心课程 观看链接:https://www.bilibili.com/video/av29500928?from=search&seid=47008639320014639 ...
- 怎么解决Win7电脑更新出现80072EE2代码的错误?
我们在使用Win7系统时经常会遇到更新,这些更新可以修复一些系统漏洞,提高系统的安全性.但有时我们在进行相关更新时会出现错误,而导致最后的更新失败.下面好系统重装助手就和大家分享一下Win7系统更新出 ...