Description

神犇xzyo听说sl很弱,于是出了一题来虐一虐sl。一个长度为2n(可能有前缀0)的非负整数x是good的,当且仅当
存在两个长度为n(可能有前缀0)的非负整数a、b满足a+b==10n,并且对于0~9每个数位d,都有Sd(x)==Sd(a)+Sd(
b)(Sd(x)为x的十进制中d出现了多少次)。例如0829是good的,98+02==100。给出一个长度为2n的序列,其中有些
位置是问号。将每个问号替换为0~9任意一个数位后,有多少个good数,答案对1000000007取膜。为了sl不被虐死
,快告诉他怎么写吧。
两个数相加为10^n,意味着可以将数位一部分按09,18,27,36,45配对表示较高位的情况,低位有一对19,28,37,46,55产生了一次进位,更低位可以全0。枚举哪一对数产生进位,可以算出0的出现次数-9的出现次数,1-8,2-7,3-6,4-5的值,然后做一次背包。需要特判一些情况:因为两个0可以配对,0-9的值表示的是0至少比9多几个,实际可以再把一些9换成0,但如果19产生进位,必须留下至少一个9(可能来自已确定的数位,也可能必须由?提供)而不能全部换成0。
#include<bits/stdc++.h>
typedef long long i64;
const int P=1e9+;
char s[];
int n,t[],m=,ts[];
i64 f[],g[],fac[],fiv[],ans=;
i64 _ks[][],(*ks)[]=_ks+;
bool d9=;
void cal(int tp){
memset(f,,sizeof(f));
f[]=;
for(int i=;i<;++i){
memset(g,,sizeof(g));
if(ts[i]>m||i&&ts[i]<-m)return;
if(!i){
while(ts[i]<-m)ts[i]+=;
for(int s=,d=;s<=m;++s){
i64 iv=ks[ts[i]][s];
if(!iv)continue;
if(tp==&&!d9&&(s+ts[i])%==)iv=(iv-fiv[s]+P)%P;
for(int j=s;j<=m;++j)g[j]+=f[j-s]*iv;
if(++d>){
d=;
for(int j=;j<=m;++j)g[j]%=P;
}
}
}else for(int a=ts[i],b=,d=;a+b<=m;++a,++b)if(a>=){
int s=a+b;
i64 iv=fiv[a]*fiv[b]%P;
for(int j=s;j<=m;++j)g[j]+=f[j-s]*iv;
if(++d>){
d=;
for(int j=;j<=m;++j)g[j]%=P;
}
}
for(int j=;j<=m;++j)f[j]=g[j]%P;
}
ans=(ans+f[m]*fac[m])%P;
}
i64 pw(i64 a,int n){
i64 v=;
for(;n;n>>=,a=a*a%P)if(n&)v=v*a%P;
return v;
}
int main(){
for(int i=fac[]=;i<=;++i)fac[i]=i*fac[i-]%P;
fiv[]=pw(fac[],P-);
for(int i=;i;--i)fiv[i-]=i*fiv[i]%P;
scanf("%s",s);
n=strlen(s);
if(n&)return puts(""),;
for(int i=;i<n;++i){
if(s[i]=='?')++m;
else ++t[s[i]-''];
d9|=s[i]=='';
}
for(int i=m;i>=-m;--i){
for(int a=i,b=;a+b<=m;++a,++b)if(a>=)ks[i][a+b]=fiv[a]*fiv[b]%P;
for(int j=;j<=m;++j)ks[i][j]=(ks[i][j]+ks[i+][j])%P;
}
for(int i=;i<=;++i){
for(int j=;j<;++j)ts[j]=t[j];
--ts[i],--ts[-i];
for(int j=;j<;++j)ts[j]=ts[-j]-ts[j];
i64 a0=ans;
cal(i);
a0=ans-a0;
}
printf("%lld\n",ans);
return ;
}

bzoj4980: 第一题的更多相关文章

  1. [算法 笔记]2014年去哪儿网 开发笔试(续)第一题BUG修正

    上一篇的blog地址为:http://www.cnblogs.com/life91/p/3313868.html 这几天又参加了一个家公司的笔试题,在最后的编程题中竟然出现了去哪儿网开发的第一题,也就 ...

  2. 《学习OpenCV》练习题第五章第一题ab

    这道题是载入一幅带有有趣纹理的图像并用不同的模板(窗口,核)大小做高斯模糊(高斯平滑),然后比较用5*5大小的窗口平滑图像两次和用11*11大小的窗口平滑图像一次是否接近相同. 先说下我的做法,a部分 ...

  3. 《学习OpenCV》练习题第四章第一题b&c

    #include <highgui.h> #include <cv.h> #pragma comment (lib,"opencv_calib3d231d.lib&q ...

  4. 《学习OpenCV》练习题第四章第一题a

    #include <highgui.h> #include <cv.h> #pragma comment (lib,"opencv_calib3d231d.lib&q ...

  5. Google Code Jam 第一题

    通过的第一题,留做纪念,呵呵,非常简单,Africa 2010, Qualification Round: Store Credit. #include <stdio.h> #includ ...

  6. 图论测试题(一)第一题:longest

    第一题:longest 乌托邦有n个城市,某些城市之间有公路连接.任意两个城市都可以通过公路直接或者间接到达,并且任意两个城市之间有且仅有一条路径(What does this imply? A tr ...

  7. ZOJ 2334(Monkey King-左偏树第一题)

    Monkey King Time Limit: 10 Seconds      Memory Limit: 32768 KB Once in a forest, there lived N aggre ...

  8. BZOJ 3172([Tjoi2013]单词-后缀数组第一题+RMQ)

    3172: [Tjoi2013]单词 Time Limit: 10 Sec   Memory Limit: 512 MB Submit: 268   Solved: 145 [ Submit][ St ...

  9. NOIP2005-普及组复赛-第一题-陶陶摘苹果

    题目描述 Description 陶陶家的院子里有一棵苹果树,每到秋天树上就会结出10个苹果.苹果成熟的时候,陶陶就会跑去摘苹果.陶陶有个30厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩到板凳 ...

随机推荐

  1. Visual Studio 2019 RC

    Visual Studio 2019 RC入门 介绍 在本文中,让我们看看如何开始使用Visual Studio 2019 RC.Microsoft现已发布Visual Studio Release ...

  2. acm 2084

    ////////////////////////////////////////////////////////////////////////////////#include<iostream ...

  3. web服务器和数据库服务器分离的优势

    一般我们服务器都是分开的,网页服务器.数据服务器单独配置. web服务器不掉,那么就可以正常使用,data服务器掉了,那么web还可以坚持一会. 如果是web服务器掉了,那么就上不去了,不过有一些设置 ...

  4. 鸟哥的linux私房菜第4版--自学笔记

    -----------------------------------第一章 intel芯片架构 PS:升级电脑还得看看主板是不是适合CPU,主板适合CPU的类型是有限的PS: 现在已经没有北桥了,已 ...

  5. Centos7修改默认最大文件打开数

    方法一: [root@bogon ~]# vi /etc/systemd/system.conf [root@bogon ~]# cat /etc/systemd/system.conf # This ...

  6. JDBC事务的处理-----模拟银行转账业务

    定义: 数据库事务(简称:事务)是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成. 概要: 一个数据库事务通常包含了一个序列的对数据库的读/写操作.它的存在包含有以下两个目的: ...

  7. hasura graphql-engine &&patroni docker-compose 环境运行

    patroni 是一个很不错的pg ha 解决方案,graphql-engine 是一个很好的graphql 工具,为了方便使用 参考patroni官方的文档,使用docker-compose 将应用 ...

  8. ElementUI(vue UI库)、iView(vue UI库)、ant design(react UI库)中组件的区别

    ElementUI(vue UI库).iView(vue UI库).ant design(react UI库)中组件的区别: 事项 ElementUI iView ant design 全局加载进度条 ...

  9. k8s 的使用

    Kubernetes 是什么:在 Docker 技术的基础上,为容器化的应用提供部署运行.资源调度.服务发现和动态伸缩等一系列完整功能,提高了大规模容器集群管理的便捷性的工具.

  10. 笔记本centos 取消 关闭盖子自动挂起

    修改 vi /etc/systemd/logind.conf HandleLidSwitch=ignore ( 操作盖子开关=忽略  ) 这样关闭盖子 就不会挂起了.