给出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. LTP介绍

    1.LTP介绍    LTP--linut test project ,ltp套件是由Linux Test Project所开发的一套系统測试套件.它基于系统资源的利用率统计开发了一个測试的组合,为系 ...

  2. oracle dg坏境主库redolog改动大小

    --备库standby 主库四个redolog 曾经都是50M大小 SQL> alter database recover managed standby database cancel;   ...

  3. Arduino 入门程序示例之直流电机(2015-06-15)

    概述 演示直流电机的控制. 示例程序 PWM控制直流电机 略过控制电机转停的示例啦,有需要就把这里的 PWM 换成数字口输出 HIGH 或 LOW 就行了. // ------------------ ...

  4. 幻世(OurDream)2D图形引擎使用教程11——播放媒体文件(1)

    声明:本教程版权归Lizcst Software Lab所有,欢迎转载,但是转载必须保留本段声明文字,并注明文章来源:http://blog.csdn.net/kflizcst 谢谢合作! 播放媒体是 ...

  5. [转]php连接postgresql

    首先推荐一下postgres数据库,免费,强大,甚至某些方面比商业数据库还要好,大家可以试试. 安装: 附安装图解(网上找的):http://blog.sina.com.cn/s/blog_5edb7 ...

  6. 05-UIKit(UITableViewController)

    目录: 一.UITableViewController(表视图控制器) 二.委托协议 三.tableview工作过程(三问一响应) 四.UITableViewCell 回到顶部 一.UITableVi ...

  7. Django的url解析

    Django中采用正则表达式来匹配所请求的url,这个叫做URLconf,作为MVC中的C(控制器), 这样再调用相应的试图,达到控制器控制试图的显示的效果. 看一下Django的url解析过程 第一 ...

  8. JNI 详细解释

    JNI事实上,Java Native Interface缩写,那是,java本地接口.它提供了许多API实现和Java和其它语言的通信(主要是C&C++). 或许不少人认为Java已经足够强大 ...

  9. HDOJ 5088 Revenge of Nim II 位运算

    位运算.. .. Revenge of Nim II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Ja ...

  10. JS firebug小技巧

    实际上前端的发展与进步也离不开浏览器的支持,而对于开发者来讲,浏览器最好的支持,就是对于debug的良好支持,甚至在某些兴许接手的项目中,前端的debug甚至能够解决好多问题--不说了,都是泪啊!还是 ...