给出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. 网络爬虫 kamike.collect

    Another Simple Crawler 又一个网络爬虫,可以支持代理服务器的FQ爬取. 1.数据存在mysql当中. 2.使用时,先修改web-inf/config.ini的数据链接相关信息,主 ...

  2. OGR SQL (GEOM)

    The OGRDataSource supports executing commands against a datasource via the OGRDataSource::ExecuteSQL ...

  3. linux 单网卡绑定两个ip

    一.ubuntu系统: #vi /etc/network/interfaces  OR  $ sudo vi /etc/network/interfaces Modify as follows: au ...

  4. 富文本编辑器 - wangEditor 表情

    效果: 文件夹中的表情: 代码:

  5. android handler looper thread

    在线程中调用包含创建handler方法的时候,会报错,提示: “need call Looper.prepare()” -- 在创建之前,调用Looper.prepare()方法来创建一个looper ...

  6. 获取浏览器版本Asp.Net

    public static string GetBrowser() { HttpBrowserCapabilities bc = HttpContext.Current.Request.Browser ...

  7. html submit 登录

    <!doctype html> <html lang="en"> <head> <meta name="Generator&qu ...

  8. 【手打】LZW编码的C/C++实现

    LZW编码通过建立一个字符串表,用较短的代码来表示较长的字符串来实现压缩. LZW压缩算法是Unisys的专利,有效期到2003年,所以相关算法大多也已过期. 本代码只完毕了LZW的编码与解码算法功能 ...

  9. 当装了两个tomcat后,如何修改tomcat端口

    链接地址:http://blog.csdn.net/alongwilliam/article/details/8199974 以前只知道当tomcat端口号冲突了如何修改tomcat默认的8080端口 ...

  10. 基于visual Studio2013解决面试题之0902内存拷贝

     题目