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. CodeForces - 1101D:GCD Counting (树分治)

    You are given a tree consisting of n vertices. A number is written on each vertex; the number on ver ...

  2. Nginx环境搭建准备

    前提: 1.确认系统网络 2.确认yum可用 3.确认关闭iptables规则 4.确认停用selinux 1.cd /opt mkdir app download logs work backup ...

  3. mysql操作基本命令

    查看索引 : show index from table_name 创建索引:create index index_name on table_name(column_name) 创建唯一索引:cre ...

  4. test-ipv6

    http://test-ipv6.com/ ! 你的公网 IPv4 地址是 89.42.31.211! 你的公网 IPv6 地址是 2001:ac8:21:8::376e:989b! 你已接入 IPv ...

  5. C++学习(十五)(C语言部分)之 数组二

    数组大纲 多维数组 二维数组 重点 (三位以上基本不会用到) 都是用来存数据 一个班有20个人 可以用一维数组存20个人的年龄 int age[20]; 一个年级10个班 每个班20人 int age ...

  6. hibernate--DetachedCriteria(离线条件查询)

    一.叙述 离线条件查询的好处,可以在非dao层封装查询参数,封装完成后,将对象传递到dao层,关联到session后,再去查询数据,这样做dao层可以极大的简化代码.下面通过一个小案例,一起来感受一下 ...

  7. linux令普通用户拥有root权限

    如题,平时我们在自己电脑上玩linux,基本都是一个root用户就够了(反正我99%时间都是直接用root用户登录系统),可如果在公司里就不行了,有时候需要多个用户对系统具有root权限,类似与一个系 ...

  8. HDU2220 Eddy's AC难题

    版权声明:长风原创 https://blog.csdn.net/u012846486/article/details/27853287 Eddy's AC难题 Time Limit: 3000/100 ...

  9. Visual Studio项目的生成事件代码

    我们打开vs的项目属性可以看到有生成事件,如下图: 可以看到有两块空白区域,这个空白区域可以让我们写代码或脚本来处理编译生成前后的时候,处理一些事情,今天就简单的来说说这两块. 生成前事件命令行 我想 ...

  10. vue的watcher 关于数组和对象

    数组 不能被监听到的情况 1.直接下标赋值(但对象直接修改原有属性值可以渲染视图,虽然也监听不到) 2.修改数组length 解决方法: this.$set(this.arr,index,val) p ...