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 test2 secondsmemory limit per test256 megabytes
#### 问题描述
> There have recently been elections in the zoo. Overall there were 7 main political parties: one of them is the Little Elephant Political Party, 6 other parties have less catchy names.
>
> Political parties find their number in the ballot highly important. Overall there are m possible numbers: 1, 2, ..., m. Each of these 7 parties is going to be assigned in some way to exactly one number, at that, two distinct parties cannot receive the same number.
>
> The Little Elephant Political Party members believe in the lucky digits 4 and 7. They want to evaluate their chances in the elections. For that, they need to find out, how many correct assignments are there, such that the number of lucky digits in the Little Elephant Political Party ballot number is strictly larger than the total number of lucky digits in the ballot numbers of 6 other parties.
>
> Help the Little Elephant Political Party, calculate this number. As the answer can be rather large, print the remainder from dividing it by 1000000007 (109 + 7).
#### 输入
> A single line contains a single positive integer m (7 ≤ m ≤ 109) — the number of possible numbers in the ballot.
#### 输出
> In a single line print a single integer — the answer to the problem modulo 1000000007 (109 + 7).
样例输入
7
样例输出
0
样例输入
8
样例输出
1440
题意
求[1,m]之间选7个数,保证其中一个数数位中包含4,7的个数比其他6个数的4,7的个数都加起来的都多。求满足条件的组合有多少种。
题解
先用数位dp求出包含k个4或7的数有多少个,然后再枚举最大的那个数有多少个4或7,去深搜回溯所有满足条件的情况。
代码
#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<stack>
#include<ctime>
#include<vector>
#include<cstdio>
#include<string>
#include<bitset>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<functional>
using namespace std;
#define X first
#define Y second
#define mkp make_pair
#define lson (o<<1)
#define rson ((o<<1)|1)
#define mid (l+(r-l)/2)
#define sz() size()
#define pb(v) push_back(v)
#define all(o) (o).begin(),(o).end()
#define clr(a,v) memset(a,v,sizeof(a))
#define bug(a) cout<<#a<<" = "<<a<<endl
#define rep(i,a,b) for(int i=a;i<(b);i++)
#define scf scanf
#define prf printf
typedef __int64 LL;
typedef vector<int> VI;
typedef pair<int,int> PII;
typedef vector<pair<int,int> > VPII;
const int INF=0x3f3f3f3f;
const LL INFL=0x3f3f3f3f3f3f3f3fLL;
const double eps=1e-8;
const double PI = acos(-1.0);
//start----------------------------------------------------------------------
const int mod=1e9+7;
int m;
int Num[11];
int arr[11],tot;
LL dp[11][11];
///ismax标记表示前驱是否是边界值
///ser标记前驱是否是前导零
LL dfs(int len,int k, bool ismax) {
if(k<0) return 0;
if (len == 0) {
///递归边界,这说明前驱都合法了
return k==0;
}
if (!ismax&&dp[len][k]>=0) return dp[len][k];
LL res = 0;
int ed = ismax ? arr[len] : 9;
for(int i=0;i<=ed;i++){
res+=dfs(len-1,(i==4||i==7)?k-1:k,ismax&&i==ed);
}
return ismax ? res : dp[len][k] = res;
}
LL ans;
void dfs2(int num,int ma,int cnt,LL sum){
if(cnt>=ma) return;
if(num==6){
ans=(ans+sum)%mod;
return ;
}
for(int i=0;i<=9;i++){
Num[i]--;
dfs2(num+1,ma,cnt+i,sum*(Num[i]+1)%mod);
Num[i]++;
}
}
LL solve(LL x,int k) {
tot = 0;
while (x) { arr[++tot] = x % 10; x /= 10; }
return dfs(tot,k,true);
}
int main() {
clr(dp,-1);
scf("%d",&m);
for(int i=0;i<=9;i++) Num[i]=solve(m,i);
Num[0]--;
ans=0;
for(int i=0;i<=9;i++){
Num[i]--;
dfs2(0,i,0,Num[i]+1);
Num[i]++;
}
prf("%I64d\n",ans);
return 0;
}
//end-----------------------------------------------------------------------
Codeforces Round #157 (Div. 1) B. Little Elephant and Elections 数位dp+搜索的更多相关文章
- Codeforces Round #157 (Div. 2) D. Little Elephant and Elections(数位DP+枚举)
数位DP部分,不是很难.DP[i][j]前i位j个幸运数的个数.枚举写的有点搓... #include <cstdio> #include <cstring> using na ...
- Codeforces Round #235 (Div. 2) D. Roman and Numbers (数位dp、状态压缩)
D. Roman and Numbers time limit per test 4 seconds memory limit per test 512 megabytes input standar ...
- Codeforces Round #597 (Div. 2) F. Daniel and Spring Cleaning 数位dp
F. Daniel and Spring Cleaning While doing some spring cleaning, Daniel found an old calculator that ...
- Codeforces Round #460 (Div. 2) B Perfect Number(二分+数位dp)
题目传送门 B. Perfect Number time limit per test 2 seconds memory limit per test 256 megabytes input stan ...
- Codeforces Round #157 (Div. 2)
A. Little Elephant and Chess 模拟. B. Little Elephant and Magic Square 枚举左上角,计算其余两个位置的值,在\(3\times 3\) ...
- Codeforces Round #396 (Div. 2) A B C D 水 trick dp 并查集
A. Mahmoud and Longest Uncommon Subsequence time limit per test 2 seconds memory limit per test 256 ...
- Codeforces Round #136 (Div. 1)C. Little Elephant and Shifts multiset
C. Little Elephant and Shifts Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/pro ...
- 字符串(后缀自动机):Codeforces Round #129 (Div. 1) E.Little Elephant and Strings
E. Little Elephant and Strings time limit per test 3 seconds memory limit per test 256 megabytes inp ...
- Codeforces Round #136 (Div. 1) B. Little Elephant and Array
B. Little Elephant and Array time limit per test 4 seconds memory limit per test 256 megabytes input ...
随机推荐
- javascript中的属性注意事项
1.函数原型prototype设置的对象是只读类型,所以不能修改(即栈只读).但是我们常常可以看到它被“修改‘’了.若对象中定义的属性和原型中属性一样,优先使用自定义属性. 例如代码: //原型 类似 ...
- WPF 跟随鼠标动画 by wgscd
WPF 跟随鼠标动画 by wgscd <UserControl x:Class="WpfApplication1.Spark" xmlns="http://sch ...
- PostgreSQL的Checkpoint 发生的时机
磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面:PostgreSQL基础知识与基本操作索引页 回到顶级页面:PostgreSQL索引页 官方说明来自: http://www.postg ...
- Linux命令学习笔记1
1.Linux命令学习 2.Mkdir /data -创建文件夹 在/下创建文件夹 data 3.Cd -目录切换 列如cd / 4.Touch /data/1 ...
- 13-[函数进阶]-列表生成式,生成器&迭代器
1.列表生成式 Python一种独特的语法,相当于语法糖的存在,可以帮你在某些场合写出比较精简酷炫的代码.但没有它,也不会有太多的影响. 语法糖(Syntactic sugar),也译为糖衣语法,是由 ...
- 3 huigu
w +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 组件复用 --------------- ...
- PCA人脸识别的python实现
这几天看了看PCA及其人脸识别的流程,并在网络上搜相应的python代码,有,但代码质量不好,于是自己就重新写了下,对于att_faces数据集的识别率能达到92.5%~98.0%(40种类型,每种随 ...
- ubuntu下编译源码 make 出现 make: 'Makefile' is up to date.
其实只需要 make就行了,不需要 make Makefile 当然,make的前提是,执行 ./configure 不报错
- [VB.NET][C#]调用API获取或设置键盘按键状态
前言 通过 C# 或 VB.NET,你只需编写少量的代码即可实现一个按键精灵. 第一节 接口 调用系统 API 实现获取或设置指定的按键状态. 获取按键状态 调用 GetAsyncKeyState() ...
- dbutis事务管理
1.在dao层用dbutils实现事务管理 //从a--->b帐户转100元 public void transfer() throws SQLException{ Connection con ...