zoukankan      html  css  js  c++  java
  • 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 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
    ",ans);
    
        return 0;
    }
    
    //end-----------------------------------------------------------------------
  • 相关阅读:
    sql中别名加as和不加as的区别
    easyui 扩展 datagrid 数据网格视图
    asp.net 版本一键升级,后台直接调用升级脚本
    SQLserver 还原数据库报“指定转换无效”的错的解决方案
    sql视图显示数据不对应
    django channels 实现实时通讯,主动推送
    django orm信号机制 + apschedule 定时任务
    django 使用原始SQL语句方式
    Django model 常用查询(搬运来备份的)
    Python3+ Django2.7开发web排坑记006 apache+wsgi部署应用
  • 原文地址:https://www.cnblogs.com/fenice/p/5907737.html
Copyright © 2011-2022 走看看