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. tomcat配置https–采用JDK自带的keytool工具生成证书

    转自:http://blog.csdn.net/huangxinyu_it/article/details/41693633 有关http与https的区别请看<浅谈http与https的区别( ...

  2. T-SQL 基础

    什么是T-SQL语言? T-SQL语言是SQL语言的扩展和增强,是与SQL server交流沟通的语言之一. T-SQL的组成部分,数据定义语言-DDL(对数据库对象的创建和管理),数据控制语言-DC ...

  3. Python基础进程和线程

    一 背景知识 进程的概念起源于操作系统,是操作系统最核心的概念. 进程是对正在运行程序的一个抽象,操作系统的其他所有内容都是围绕进程的概念展开的.所以想要真正了解进程,必须事先了解操作系统,egon介 ...

  4. web网页【2】

    前端代码: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.as ...

  5. 【BZOJ1213】高精度开根

    python是坠吼的! 原题: 不贴原题,就是高精度开根,结果向下取整 首先二分答案,高精度嘛……python即可 二分右端点设为n会T掉,需要先倍增一个r,while(r **m <= n) ...

  6. lua-resty-shell 多任务执行

    已经写过一个openresty 使用lua-resty-shell 执行shell 脚本的demo,但是实际上我们可能是多节点运行, 同时需要负载均衡的机制. lua-resty-shell 支持un ...

  7. VS版本号定义、规则和相关的Visual Studio插件

    软件版本号主要标识了软件的版本,通过其可以了解软件.类库文件的当前版本,使得软件版本控制有所依据. 我们就Windows系统和.NET Framework的编号规则来看,软件版本号的定义结构一般是这样 ...

  8. Electron-vue 新建Demo

    vue init simulatedgreg/electron-vue Test(项目名)

  9. tomcat源码阅读之集群

    一. 配置: 在tomcat目录下的conf/Server.xml配置文件中增加如下配置: <!-- Cluster(集群,族) 节点,如果你要配置tomcat集群,则需要使用此节点. clas ...

  10. es中级部分知识点总结

    --------------------------------------------------------------- 搜索开始-------------------------------- ...