[Codeforces 258B & 259 D]Little Elephant and Elections 数位dp+dfs

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

题目大意:

说七个party选择数字(各不相同)

而规定的小象的party选择的数字之中所拥有的数字4和7的个数要比其他六个party拥有的个数之和还要严格多,询问方案数。

如m=7时其余的随意选择至少会拥有一个4或7,与题意矛盾,故方案数为0

m=8时,7 1 2 3 5 6 8是一种合法方案

思路:

由于小象的party选到的数字所含4和7的个数至多和m的位数一样多,则枚举小象的party所含4和7的个数,剩余的6个party直接用dfs即可(直接用乘法原理)。

而通过数位dp可以算出1~m之中所拥有k个幸运数字的个数,这里为了思路简便采取了记忆化搜索的方法,详见代码和注释。

code:

#include <cstdio>
#include <cstring>
#include <cmath>
#include <map>
#include <algorithm>
#include <cstdlib>
#define SIZES 40000
#define mod 1000000007ll
using namespace std;
long long dp[20][20];
long long res[20];
int bit[20],bn;
long long m,n,pn,ans;
void deep(int now,int _max,int party,long long cur)//now代表拥有的幸运数字的个数,_max上限,party代表序号,cur为方案数
{
    if (now>_max) return;//已经超过
    if (party==7) {
        if (now<_max){
            ans+=cur;//加到答案中
            ans%=mod;
        }
        return;
    }
    for (int i=0;i<bn;i++)
    {
        if (res[i])//是否还可行
        {
            res[i]--;
                deep(now+i,_max,party+1,cur*(res[i]+1)%mod);
            res[i]++;
        }
    }
}
long long dfs(long long pos,long long target,long long limit)//pos代表处理的位数,target为还需几个幸运数,limit代表目前是否有限制
{
    long long sum=0;
    if (pos==0) return target==0;//是否符合要求
    if ((limit==0)&&(dp[pos][target]!=-1)) return dp[pos][target];//已经计算过的不必计算

    long long tail=limit?bit[pos]:9;//确定枚举的上限
    for (int i=0;i<=tail;i++)
        sum+=dfs(pos-1,target-(i==4||i==7),(limit==1)&&(bit[pos]==i));
    if (limit==0) dp[pos][target]=sum;
    return sum;
}
void cal(long long x)
{
    ans=bn=0;
    long long y=x;
    while (y)
    {
        ++bn;
        bit[bn]=y%10;
        y/=10;
    }
    for (int i=0;i<=bn;i++)
        res[i]=dfs(bn,i,1);//记忆化搜索算出可选个数
    res[0]-=1;//去掉单个数字为0的情况
    for (int i=1;i<=bn;i++)
        deep(0,i,1,res[i]);//枚举所选的幸运数字个数
}
int main()
{
    long long m;
    memset(dp,-1,sizeof dp);
    scanf("%I64d",&m);
    cal(m);
    printf("%I64d\n",ans);
    return 0;
}

[Codeforces 258B & 259 D]Little Elephant and Elections 数位dp+dfs,布布扣,bubuko.com

时间: 2024-12-23 13:02:58

[Codeforces 258B & 259 D]Little Elephant and Elections 数位dp+dfs的相关文章

CodeForces 258B Little Elephant and Elections 数位DP

前面先用数位DP预处理,然后暴力计算组合方式即可. #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <climits> #include <string> #include <iostream> #include <map> #include <cstdlib> #include

CodeForces 204A Little Elephant and Interval 数位DP

#include <cstdio> #include <cstring> using namespace std; typedef __int64 LL; int a[33]; LL dp[33][10]; LL dfs(int x, int s, int e, int flag, int first) { if(x == -1) return s == e; if(!flag && dp[x][s]!= -1) return dp[x][s]; int end =

Educational Codeforces Round 8(D. Magic Numbers(数位DP))

题目链接:点击打开链接 题意:给一个m一个d, 一个字符串a和b, 问在[a,b]范围内, 有多少个可以整除m的魔法数, 魔法数的定义是, 偶数位上都是d, 奇数位上都不是d. 思路:据说是典型的数位DP, 以前没做过数位DP, 感觉和DP差不多? 用d[i][j][p]表示当前到了第i位, 余数为j, p == 1表示目前和b串相等, p == 0表示已经比b串小了.  每次枚举第i位上放的数, 转移就行了. 区间也好弄, 我们可以先处理出小于等于b的所有情况ans1, 小于等于a的所有情况a

Codeforces 1245F. Daniel and Spring Cleaning(容斥原理+数位DP)

传送门 题目大意 给你两个数,\(l,r\) 求 \([l,r]\) 中多少对 \(a+b=a\oplus b\). 思路 看了大佬的题解才知道这里要用到二维容斥. 设 \(f_{x,y}\) 是 \(a\in [0,x],b\in [0,y]\) 时满足条件的对数 那么根据容斥原理答案就是 \(f_{r,r}-f_{l-1,r}\times 2+f_{l-1,l-1}\) 对于其中每一部分都可以用一次数位DP求出来 因为这里对于统计有影响的因素只有两个数是否被限制 那么状态可以直接设计为 \(

Little Elephant and Elections CodeForces - 258B

Little Elephant and Elections CodeForces - 258B 题意:给出m,在1-m中先找出一个数x,再在剩下数中找出6个不同的数y1,...,y6,使得y1到y6中数字4和7出现的总次数严格小于x中数字4和7出现的总次数.求方案数. 方法:先数位dp分别预处理出:1到m之间,数字4和7出现的总次数为0到9的数.(总共最多10个数字,第一个最大1,因此4和7出现的总次数最多9次)然后枚举x,再暴力dfs枚举6个数,统计方案数. 问题(细节): 1.(13行)数位

Codeforces Round #259 (Div. 2) 解题报告

终于重上DIV1了.... A:在正方形中输出一个菱形 解题代码: 1 // File Name: a.cpp 2 // Author: darkdream 3 // Created Time: 2014年08月01日 星期五 23时27分55秒 4 5 #include<vector> 6 #include<set> 7 #include<deque> 8 #include<stack> 9 #include<bitset> 10 #inclu

Codeforces Round #259 (Div. 2) (简单模拟实现题)

题目链接:http://codeforces.com/problemset/problem/454/A A. Little Pony and Crystal Mine time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Twilight Sparkle once got a crystal from the Crystal Mine

Codeforces Round #259 (Div. 2) (序列)

题目链接:http://codeforces.com/contest/454/problem/B B. Little Pony and Sort by Shift time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output One day, Twilight Sparkle is interested in how to sort a se

Codeforces Round #259 (Div. 2)

A. Little Pony and Crystal Mine 题意:输出一个类似于十字形的东西 题解:直接打印即可... 代码: 1 var n,i,j:longint; 2 begin 3 readln(n); 4 for i:=1 to n>>1 do 5 begin 6 for j:=1 to (n-i<<1+1)>>1 do write('*'); 7 for j:=1 to i<<1-1 do write('D'); 8 for j:=1 to