给出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. jquery ajax json 数据的遍历

    需求:进行ajax请求后,后台传递回来以下json数据 { "data":[ {","name":"选择A","valu ...

  2. gradle项目与maven项目相互转化(转)

    根据build.gradle和setting.gradle文件生成idea项目: gradle idea gradle这几年发展迅猛,github越来越多的项目都开始采用gradle来构建了,但是并不 ...

  3. 使用线程新建WPF窗体(公用进度条窗体)

    使用线程新建窗体 项目中需要一个公用的进度条窗体.大家知道在wpf中,有两个线程,一个是UI线程,另一个是监听线程(一直监听用户的输入).如果我们后台有阻塞UI线程的计算存在,那么界面上的比如进度条什 ...

  4. ios创建画笔的样例(双笔画效果)

    定义一个UIView:主要是在这个View里面加一个UIImageView,绘图都在这个UIImageView里面进行 @property(nonatomic) CGPoint prePoint; / ...

  5. 在cmd窗口中查询android的sqlite3数据库表之步骤

    本文主要是写了一个android程序对sqlite3中数据库的employee表的插入.删除的操作,然后在cmd窗口中用sql命令查询employee表的操作过程. 1.第一步:首先把程序写好. 1. ...

  6. BZOJ 3631: [JLOI2014]松鼠的新家( 树链剖分 )

    裸树链剖分... ------------------------------------------------------------------- #include<bits/stdc++ ...

  7. 开源软件实践之linux高性能服务器编程框架和选型

    很多人学习编程技术一般都通过一本编程语言的入门书籍,然后尝试做一些例子和小项目.但是这些都不能让我们深入的学习很多的编程技巧和高深技术,当然这个时候很多有经验的学习人员就会告诉大家,找一个好的开源软件 ...

  8. api 跳转规则

    api 配置: <Context docBase="zjzc-web-api" path="/api" reloadable="false&qu ...

  9. Android imageView图片按比例缩放

    android:scaleType可控制图片的缩放方式,示例代码如下: <ImageView android:id="@+id/img" android:src=" ...

  10. 半透明panel

    用API  SetLayeredWindowAttributes