题目链接:

http://codeforces.com/problemset/problem/258/B

B. Little Elephant and Elections

time limit per test2 seconds
memory 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+搜索的更多相关文章

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

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

  2. 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 ...

  3. 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 ...

  4. 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 ...

  5. Codeforces Round #157 (Div. 2)

    A. Little Elephant and Chess 模拟. B. Little Elephant and Magic Square 枚举左上角,计算其余两个位置的值,在\(3\times 3\) ...

  6. 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 ...

  7. 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 ...

  8. 字符串(后缀自动机):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 ...

  9. 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 ...

随机推荐

  1. Scala(一):函数、流程控制、参数

    Function:函数函数的定义: def 函数名(参数):返回类型=函数实现体 eg:def abs(x:Long) : Long = if(x >= 0) x else -x 你必须给出所有 ...

  2. uliweb框架数据库操作

    先安装数据库和相关的库文件 sudo aptitude install python-setuptools sudo easy_install SQLAlchemy sudo easy_install ...

  3. [agc011E]Increasing Numbers-[思考题]

    Description 传送门 Solution 依题得所有不下降数(设为a)可以拆为若干个全1数的和(如:1558=1111+111+111+111+111+1+1+1) 并且任意a所能拆出的全一数 ...

  4. python线程的使用模式

    为了解决阻塞(如I/O)问题,我们需要对程序进行并发设计. 本文将通过将线程和队列 结合在一起,轻松地在 Python 中完成线程编程,创建一些简单但有效的线程使用模式. 一.使用线程 先看一个线程不 ...

  5. 【转载】malloc内存分配与free内存释放的原理

    原文:http://www.cnblogs.com/huhuuu/p/3456662.html 前段时间一直想看malloc的原理,在搜了好几篇malloc源码后遂放弃,晦涩难懂. 后来室友买了本深入 ...

  6. Codeforces 909 C. Python Indentation (DP+树状数组优化)

    题目链接:Python Indentation 题意: Python是没有大括号来标明语句块的,而是用严格的缩进来体现.现在有一种简化版的Python,只有两种语句: (1)'s'语句:Simple ...

  7. JAVAEE Eclipse 控制台用起来感觉很不方便的原因

    这是因为切换成了java面板的原因 因为之前有切换到过 java project 项目,所以才转到了这个面板,之后如果不手动改即便是用javaee也会是这个面板,因而用起来不方便 解决方法: 切换到j ...

  8. SpringMVC 异常信息ASM ClassReader failed to parse class file的问题解决

    1.  环境信息: Spring 3.2.0,  JDK 1.8.0 2.  运行简单的程序,出现以下错误信息: 2.  运行简单的程序,出现以下错误信息: Caused by: org.spring ...

  9. 关于恶意说说自动在QQ空间转发的机制

    有些很讨厌的带链接说说,只要你在手机打开它,就会自动转发,内容极其不雅 一怒之下我决定看个究竟首先,在此页开头有此关键语句: <iframe src="http://rtb.map.q ...

  10. 【轮子狂魔】抛弃IIS,向天借个HttpListener - 基础篇(附带源码)

    这一次我们要玩什么? 先声明一下,由于这篇是基础篇主要是通过这篇文章让大家对使用HttpListener响应Http请求有个大概了解,所以正式的花样轮子在下一篇推出,敬请期待 ^_^ 嗯哼,还有,我标 ...