Problem

给出Ai(i∈[0,9])。表示每一个数字至少须要出现多少次。问有多少个数满足下面三个条件:1. 数至多有N位;2. 数不含有前导0;3. 每一个数 i 出现的次数不少于Ai(mod 1e9+7)

Limits

TimeLimit(ms):2000

MemoryLimit(MB):256

N∈[1,100]

Ai∈[0,100]

Look up Original Problem From here

Solution

实际上是一种填数、计数统计的问题。

考虑填0的情况。在此基础上。考虑填1的情况。…。最后考虑填9的情况。

因为不可含有前导0,最好还是先枚举如果第一个数字,而剩下的N-1位数字进行填数。设dp[i][j]表示当前填下的这个数为 i,数的长度是 j 时有多少个数满足题意。

转移方程:dp[now][i+j]=dp[now][i+j]+dp[now−1][j]×Cin−j。统计答案,ans=∑nj=0(dp[9][j]Cn−jn)。除法不满足取模运算。用逆元解决。

Complexity

TimeComplexity:O(9⋅9⋅N2)

MemoryComplexity:O(N2)

My Code

//Hello. I'm Peter.
#include<cstdio>
#include<iostream>
#include<sstream>
#include<cstring>
#include<string>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<functional>
#include<cctype>
#include<ctime>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<map>
using namespace std;
typedef long long ll;
typedef long double ld;
const double pi=acos(-1.0);
#define peter cout<<"i am peter"<<endl
#define randin srand((unsigned int)time(NULL))
#define INT (0x3f3f3f3f)*2
#define LL (0x3f3f3f3f3f3f3f3f)*2
#define input freopen("data.txt","r",stdin)
#define gsize(a) (int)a.size()
#define len(a) (int)strlen(a)
#define slen(s) (int)s.length()
#define clr(a) memset(a,0,sizeof(a))
#define clr_queue(q) while(!q.empty()) q.pop()
#define clr_stack(s) while(!s.empty()) s.pop()
#define rep(i, a, b) for (int i = a; i < b; i++)
#define dep(i, a, b) for (int i = a; i > b; i--)
#define repin(i, a, b) for (int i = a; i <= b; i++)
#define depin(i, a, b) for (int i = a; i >= b; i--)
#define esp 1e-6
#define MAXN
#define N 200
#define M
const ll mod=1e9+7;
ll C[N][N],ans,dp[15][N];
int n,a[N],sum;
void init_C(){
clr(C);
rep(i,0,N){
C[i][0]=1;
}
rep(i,1,N){
rep(j,1,N){
C[i][j]=(C[i-1][j-1]+C[i-1][j])%mod;
}
}
}
ll quick_power(ll x,ll y){
if(!y) return 1;
ll res=quick_power(x,y>>1);
res=res*res%mod;
if(y%2) res=res*x%mod;
return res;
}
int main(){
init_C();
ans=0;
scanf("%d",&n);
rep(i,0,10){
scanf("%d",a+i);
}
repin(de,1,9){
a[de]-=1;
n-=1;
repin(i,0,9){
repin(j,0,n){
dp[i][j]=0;
}
}
repin(i,0,n){
if(i>=a[0]) dp[0][i]=C[n][i];
}
repin(now,1,9){
repin(i,0,n){
if(i<a[now]) continue;
repin(j,0,n){
if(i+j>n || !dp[now-1][j]) continue;
dp[now][i+j]=(dp[now][i+j]+dp[now-1][j]*C[n-j][i])%mod;
}
}
}
repin(i,0,n){
// ans=(ans+dp[9][i]/C[n][n-i]); 不能直接求。转化为逆元来做。
ans=(ans+dp[9][i]*quick_power(C[n][n-i],mod-2))%mod;
}
n+=1;
a[de]+=1;
}
printf("%lld\n",ans);
}

Codeforces Round #131 Div1 B的更多相关文章

  1. Codeforces Round #543 Div1题解(并不全)

    Codeforces Round #543 Div1题解 Codeforces A. Diana and Liana 给定一个长度为\(m\)的序列,你可以从中删去不超过\(m-n*k\)个元素,剩下 ...

  2. Codeforces Round #545 Div1 题解

    Codeforces Round #545 Div1 题解 来写题解啦QwQ 本来想上红的,结果没做出D.... A. Skyscrapers CF1137A 题意 给定一个\(n*m\)的网格,每个 ...

  3. Codeforces Round #539 Div1 题解

    Codeforces Round #539 Div1 题解 听说这场很适合上分QwQ 然而太晚了QaQ A. Sasha and a Bit of Relax 翻译 有一个长度为\(n\)的数组,问有 ...

  4. [Codeforces Round #254 div1] C.DZY Loves Colors 【线段树】

    题目链接:CF Round #254 div1 C 题目分析 这道题目是要实现区间赋值的操作,同时还要根据区间中原先的值修改区间上的属性权值. 如果直接使用普通的线段树区间赋值的方法,当一个节点表示的 ...

  5. Codeforces Round #131 (Div. 1) B. Numbers dp

    题目链接: http://codeforces.com/problemset/problem/213/B B. Numbers time limit per test 2 secondsmemory ...

  6. Codeforces Round #131 (Div. 2) B. Hometask dp

    题目链接: http://codeforces.com/problemset/problem/214/B Hometask time limit per test:2 secondsmemory li ...

  7. Codeforces Round #131 (Div. 2) E. Relay Race dp

    题目链接: http://codeforces.com/problemset/problem/214/E Relay Race time limit per test4 secondsmemory l ...

  8. Codeforces Round #253 DIV1 C 馋

    http://codeforces.com/contest/442/problem/C 题意非常easy,基本上肯定有坑坑洼洼的样子.看题目案例,从第三个跟第二个没有凹的案例来看的话,多写几个以及多画 ...

  9. Codeforces Round #413 (Div1 + Div. 2) C. Fountains(树状数组维护最大值)

    题目链接:https://codeforces.com/problemset/problem/799/C 题意:有 c 块硬币和 d 块钻石,每种喷泉消耗硬币或钻石中的一种,每个喷泉有一个美丽值,问建 ...

随机推荐

  1. java Set(集合)

    set不保存重复的元素(至于如何判断元素相同则较为复杂,后面将会看到).Set中最常被使用的是测试归属表,你可以很容易地询问某个对象是否在某个Set中,正因如此,查找就成了Set最重要的操作,因此通常 ...

  2. Java编程的逻辑 (52) - 抽象容器类

    本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...

  3. day10--协成\异步IO\缓存

       协成(Gevent) 协程,又称微线程,纤程.英文名Coroutine.一句话说明什么是线程:协程是一种用户态的轻量级线程.CPU只认识线程. 协程拥有自己的寄存器上下文和栈.协程调度切换时,将 ...

  4. shell学习(一)

    一.免密交互 --stdin 1.从标准输入读取字符串 如:passwd   --stdin   heruguo246 [root@localhost mnt]#    ---输入了修改heruigu ...

  5. 002.Postfix空客户端配置

    一 空客户端介绍 空客户端必须满足(符合)以下条件: 本地发送的任何邮件都会转发到现有出站邮件中继以进行发送 本地postfix服务不接受任何电子邮件的本地发送 用户可以在空客户端运行邮件客户端来读取 ...

  6. Python - 计算个人所得税

    最近在学python,写了个计算个人所得税计算的脚本,分享. 以下为python3适用版本 #!/usr/bin/python # -*- coding: UTF-8 -*- # 该python脚本用 ...

  7. react比较入门的小demo

    什么是jsx?    JSX是JavaScript  XML 这两个单词的缩写,xml和html非常类似,简单来说可以把它理解成使用各种各样的标签,大家可以自行 百度.所以jsx就是在javascri ...

  8. android 流行框架的使用

    === OKHttp主要功能 1.联网请求文本数据 2.大文件下载 3.大文件上传 4.请求图片 get请求 Request request = new Request.Builder()       ...

  9. codevs 3022 西天收费站

    题目描述 Description 唐僧师徒四人终于发现西天就在眼前,但猴子突然发现前面有n个收费站(如来佛太可恶),在每个收费站用不同的方式要交的钱不同,输入每个收费站的每种方法收的钱,输出最少花的钱 ...

  10. 1038 一元三次方程求解 2001年NOIP全国联赛提高组

    题目描述 Description 有形如:ax3+bx2+cx+d=0  这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,d  均为实数),并约定该方程存在三个不同实根(根的范围在-100 ...