给出1,2,3...m

任取7个互不同样的数a1,a2,a3,a4,a5,a6,a7

一个数的幸运度是数位上4或7的个数

比方244。470幸运度是2。

44434,7276727。4747,7474,幸运度都是4。

求出满足a1,a2,a3,a4,a5,a6,a7这种前6个数的幸运度之和严格小于第七个数的幸运度排列共同拥有多少种

1.先求出数组t

t[i]代表1-m中幸运度为i的数的个数。

2.有了t数组后。问题变为一个排列组合问题(枚举a7幸运度。求有多少排列满足前6幸运度之和小于a7幸运度,再求和)

t数组怎么得到?

我们定义

d[i][j][0]为
0到从第1数位開始到第i数位(包含第i数位)组成的数中幸运度为j且不含自身(小于自身)的个数

d[i][j][1]为
0到从第1数位開始到第i数位(包含第i数位)组成的数中幸运度为j且包含自身(小于自身)的个数

比如m=14632,对i=2来说。14是自身;对i=3来说。146是自身。

那么

基于dp[i-1][j]转移方式例如以下

比如m=14632

我们处理好了前两位,到第三位6时

从0開始枚举0,1,2,3,4,5,6,7,8,9

首先全部数(0-5,6,7-9)都能够安插在dp[2][][0]后(显然是dp[3][][0]+=)

假设是小于6的数,还能够安插在dp[2][][1]后(显然是dp[3][][0]+=)

假设是等于6的数。还得有dp[3][][1]+=dp[2][][1]

第二维随情况变化

怎么处理例如以下的问题(枚举a7幸运度,求有多少排列满足前6幸运度之和小于a7幸运度,再求和)

我们能够拿dfs来解决

首先试着设计这个dfs

状态我们能够这么挂

dfs(int now_lucky_num,int max_lucky_num,int seq)

now_lucky_num:当前的幸运值和

max_lucky_num:幸运值上限(即a7幸运值)

seq:正在处理第几个数(正在处理a几来着)

我们要枚举全部的max_lucky_num从0到9

须要一个cur变量来记录当前的方案数目。一開始cur=t[i]

dfs中。一旦到了第七个数 或者 now_lucky_num>=max_lucky_num。就要return,另外一种情况在return之前还得把cur加到终于的答案ans上

在dfs中枚举当前a[seq]的幸运度情况。i从0-9。假设t[i]不为0的话。t[i]--后进入下一个dfs,完毕后把t[i]++复原

这样就求得了ans

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <iostream>
using namespace std;
long long f[11][11][2];
long long t[11];
long long n[11];
long long ans=0;
const long long MOD=1e9+7;
long long cur=1;
void dfs(long long now,long long limit,long long number){
if(now>=limit) return;
if(number==7){
ans+=(cur%MOD);
return;
}
for(long long i=0;i<=9;i++){
if(n[i]){
long long tmpcur=cur;
cur*=n[i];
cur%=MOD;
n[i]--;
dfs(now+i,limit,number+1);
cur=tmpcur;
n[i]++;
}
}
}
int main(){
#ifndef ONLINE_JUDGE
freopen("G:/in.txt","r",stdin);
//freopen("G:/myout.txt","w",stdout);
#endif
long long m;
cin>>m;
long long tmp=m;
for(long long i=10;i>=0 && tmp;i--){
t[i]=tmp%10;
tmp/=10;
}
f[0][0][1]=1;
for(long long i=1;i<=10;i++){
for(long long j=0;j<=10;j++){
for(long long d=0;d<=9;d++){
if(d<t[i]){
f[i][j+(d==4 || d==7)][0]+=f[i-1][j][0];
f[i][j+(d==4 || d==7)][0]+=f[i-1][j][1];
}else if(d==t[i]){
f[i][j+(d==4 || d==7)][1]+=f[i-1][j][1];
f[i][j+(d==4 || d==7)][0]+=f[i-1][j][0];
}else{
f[i][j+(d==4 || d==7)][0]+=f[i-1][j][0];
}
}
}
}
for(long long i=0;i<=10;i++)
n[i]=f[10][i][0]+f[10][i][1]-(i==0);
for(long long i=0;i<=9;i++){
cur=n[i];
dfs(0,i,1);
}
cout<<ans%MOD<<endl;
return 0;
}

CF 258B Little Elephant and Elections [dp+组合]的更多相关文章

  1. Codeforces Round #157 (Div. 1) B. Little Elephant and Elections 数位dp+搜索

    题目链接: http://codeforces.com/problemset/problem/258/B B. Little Elephant and Elections time limit per ...

  2. Little Elephant and Elections CodeForces - 258B

    Little Elephant and Elections CodeForces - 258B 题意:给出m,在1-m中先找出一个数x,再在剩下数中找出6个不同的数y1,...,y6,使得y1到y6中 ...

  3. hdu 4945 2048 (dp+组合的数目)

    2048 Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submi ...

  4. Codeforces Round #157 (Div. 2) D. Little Elephant and Elections(数位DP+枚举)

    数位DP部分,不是很难.DP[i][j]前i位j个幸运数的个数.枚举写的有点搓... #include <cstdio> #include <cstring> using na ...

  5. CF #374 (Div. 2) C. Journey dp

    1.CF #374 (Div. 2)    C.  Journey 2.总结:好题,这一道题,WA,MLE,TLE,RE,各种姿势都来了一遍.. 3.题意:有向无环图,找出第1个点到第n个点的一条路径 ...

  6. ZOJ-3380 Patchouli’s Spell Cards DP, 组合计数

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3380 题意:有m种不同的元素,每种元素都有n种不同的相位,现在假 ...

  7. HDU 5434 Peace small elephant 状压dp+矩阵快速幂

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5434 Peace small elephant  Accepts: 38  Submissions: ...

  8. HihoCoder 1075 开锁魔法III(概率DP+组合)

    描述 一日,崔克茜来到小马镇表演魔法. 其中有一个节目是开锁咒:舞台上有 n 个盒子,每个盒子中有一把钥匙,对于每个盒子而言有且仅有一把钥匙能打开它.初始时,崔克茜将会随机地选择 k 个盒子用魔法将它 ...

  9. Codeforces 918D MADMAX 图上dp 组合游戏

    题目链接 题意 给定一个 \(DAG\),每个边的权值为一个字母.两人初始各占据一个顶点(可以重合),轮流移动(沿着一条边从一个顶点移动到另一个顶点),要求每次边上的权值 \(\geq\) 上一次的权 ...

随机推荐

  1. 用python解析html

    python中,有三个库可以解析html文本,HTMLParser,sgmllib,htmllib.他们的实现方法不通,但功能差不多.这三个库中 提供解析html的类都是基类,本身并不做具体的工作.他 ...

  2. include与jsp:include区别

    jsp 中include有两种形式,分别是 <%@ include file=” ”%> <jsp:include page=” ” flush=”true”/> 前者是指令元 ...

  3. k路归并(败者树,记录败者)

          败者树在外排序中用到,每加入一个数字时,调整树需要o(lgk),比较快.外排序过程主要分为两个阶段:(1)初始化各归并段写入硬盘,初识化的方法,可利用内排序方法还可以一种叫置换选择排序的方 ...

  4. word2vec 中的数学原理具体解释(三)背景知识

      word2vec 是 Google 于 2013 年开源推出的一个用于获取 word vector 的工具包,它简单.高效,因此引起了非常多人的关注.因为 word2vec 的作者 Tomas M ...

  5. Eclipse使用技巧总结(二)

    七.快速切换打开的文件 Ctrl + F6 八.快速大写.小写转换 Ctrl + Shift + Y Ctrl + Shift + X 九.快速删除光标所在行 Ctrl + D 十.快速复制 Ctrl ...

  6. Python3 正则表达式特殊符号及用法(详细列表) http://bbs.fishc.com/thread-57691-1-1.html (出处: 鱼C论坛)

    http://bbs.fishc.com/thread-57691-1-1.html 留待查询用

  7. Robot Framework与Web界面自动化测试学习笔记:定位到新窗口

    在页面操作中,有时会需要打开新的窗口(新的网页不在当前窗口显示,而是在新的tab页显示), 比如利用  window.open("newurl") 或者  <a href=& ...

  8. shell中exec解析(转)

    参考:<linux命令.编辑器与shell编程> <unix环境高级编程> exec和source都属于bash内部命令(builtins commands),在bash下输入 ...

  9. C/C++ qsort()快速排序用法

    void qsort (void* base, size_t num, size_t size, int (*compar)(const void*,const void*));头文件stdlib.h ...

  10. Fedora20安装完Nvidia后启动一直黑屏解决办法。

    安装完Fedora20后,把Nvidia驱动装上后重起机器一直黑屏时,切换到命令行下:Alt+F2  登陆上去,然后直接更新: su -c ‘yum update’ ,再重起就OK了.