100725B Banal Tickets
题目大意
有2*n个位置,这些位置有的已经填上了数,有的还没有(用?表示),现在让你在还没有填上数的填0~9中的任意数,使得前n个数的乘积等于后n个数的乘积,问有多少种方案。
分析
首先这个题 并没有取模,所以我们要使用高精度。在这个题中我为了加速,将朴素的高精度变成了5个long long类型。然后我们将问题分为先考虑填1~9,再单独考虑填0的情况这两个子问题。
1.考虑填1~9
我们首先会想到的自然是dpij表示考虑到第i个数,乘积为j的方案数。但我们们发现由于乘积可能会很大,所以这样是不可行的。于是我们考虑优化,不难发现我们可以将所有1~9之中的数写为2p13p25p37p4的形式,于是推而广之,对于所有这些有1~9的数构成的数都可以写为这个形式。但是由于空间极小,这样还是不行的,然而对于所有i都只与i-1有关,所以我们可以使用滚动数组。然后我们再经过精妙的计算可以发现对于每个dp数组的答案都不会超过long long的范围,所以我们只需要用long long记录,到统计答案时在转化为高精度形式就行了。对于这一部分的答案就是对于每个不同的四元组(p1,p2,p3,p4)所对应的前半段的dp值乘后半段的dp值。
2.考虑填0
对于每一段,我们可以枚举填1~n个0,而这一段的方案数∑C(n,i)9^(n-i),而最终答案便是前半段求出的值乘上后半段乘上的值。
注意
有可能前半段或者后半段已经填过0了,那我们就要特判这种情况呢,这种情况的计算和考虑填0这一部分的思想相似,只不过可以不填0(即i可以等于0)。
具体实现见代码
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<ctime>
#include<vector>
#include<set>
#include<map>
#include<stack>
#include<unordered_map> using namespace std; #define ct cout
#define el endl
#define fi first
#define se second
#define pf printf
#define li long long
#define pb push_back
#define mkp make_pair
#define vi vector<int>
#define y1 y12345678909
#define rii register int
#define pii pair<int,int>
#define ck(x) cout<<x<<endl;
#define ui unsigned int
#define clr(x) memset(x,0,sizeof(x))
#define sp cout<<"---------------------------------------------------"<<endl const li Tot=1e9; inline int ra(){
int _x=,_f=;char _s=getchar();
while(!isdigit(_s)){if(_s=='-')_f=-;_s=getchar();}
while(isdigit(_s)){_x=(_x<<)+(_x<<)+(_s-'');_s=getchar();}
return _x*_f;
}
struct mint {
li _[];
int __;
};
mint operator + (mint _x,mint _y){
int _k;
li _g=;
mint _z;
for(rii _i=_x.__+;_i<=;++_i)_x._[_i]=;
for(rii _i=_y.__+;_i<=;++_i)_y._[_i]=;
if(_x.__>_y.__)_k=_x.__;
else _k=_y.__;
for(rii _i=;_i<=_k;++_i){
_z._[_i]=(_x._[_i]+_y._[_i]+_g)%Tot;
_g=(_x._[_i]+_y._[_i]+_g)/Tot;
}
if(_g>){
_z._[++_k]=_g;
}
_z.__=_k;
return _z;
}
mint operator - (mint _x,mint _y){
int _k;
_k=_x.__;
for(rii _i=_x.__+;_i<=;++_i)_x._[_i]=;
for(rii _i=_y.__+;_i<=;++_i)_y._[_i]=;
for(rii _i=;_i<=_k;++_i){
if(_x._[_i]<_y._[_i]){
_x._[_i]+=Tot;
_x._[_i+]--;
}
_x._[_i]-=_y._[_i];
}
while(_k>&&_x._[_k]==)_k--;
_x.__=_k;
return _x;
}
mint operator * (mint _x,mint _y){
int _k;
li _g=;
mint _z;
for(rii _i=_x.__+;_i<=;++_i)_x._[_i]=;
for(rii _i=_y.__+;_i<=;++_i)_y._[_i]=;
_k=_x.__+_y.__-;
for(rii _i=;_i<=;++_i)
_z._[_i]=;
for(rii _i=;_i<=_x.__;++_i)
for(rii _j=;_j<=_y.__;++_j)
_z._[_i+_j-]+=_x._[_i]*_y._[_j];
for(rii _i=;_i<=_k;++_i){
li _a=_z._[_i]+_g;
_z._[_i]=_a%Tot;
_g=_a/Tot;
}
while(_g){
_z._[++_k]=_g%Tot;
_g/=Tot;
}
while(_k>&&_z._[_k]==)_k--;
_z.__=_k;
return _z;
}
void pr(mint _x){
for(rii _i=_x.__;_i>;--_i)
if(_i!=_x.__&&_x._[_i]==){
for(rii _j=;_j<=;++_j)cout<<;
}else if(_i!=_x.__){
li _m=_x._[_i];
int _k=;
while(_m){
_m/=;
_k++;
}
for(rii _j=;_j<=-_k;++_j)cout<<;
cout<<_x._[_i];
}
else cout<<_x._[_i];
puts("");
} //---------------------------------------------------------------------------//
//---------------------------------------------------------------------------// li dp[][][][][][];
int a[][],tot[],P[][],za,zb,now[];
mint g[],c[][];
inline void init(){
for(rii i=;i<=;++i){
int m=i;
while(m%==){
P[i][]++;
m/=;
}
while(m%==){
P[i][]++;
m/=;
}
while(m%==){
P[i][]++;
m/=;
}
while(m%==){
P[i][]++;
m/=;
}
}
return;
}
inline void Get(){
for(rii i=;i<=;++i)
for(rii j=;j<=;++j)
c[i][j]._[]=,c[i][j].__=;
c[][].__=;
c[][]._[]=;
for(rii i=;i<=;++i)
c[i][].__=c[i][]._[]=c[i][i].__=c[i][i]._[]=;
for(rii i=;i<=;++i)
for(rii j=;j<i;++j)
c[i][j]=c[i-][j]+c[i-][j-];
g[].__=g[]._[]=;
mint nin;
nin.__=,nin._[]=;
for(rii i=;i<=;++i)g[i]=g[i-]*nin;
}
inline mint pw(mint a,int p){
mint res;
res.__=res._[]=;
while(p){
if(p&)res=res*a;
a=a*a;
p>>=;
}
return res;
}
inline void deal(){
mint Ans;
Ans.__=,Ans._[]=;
if(za&&!zb){
for(rii i=;i<=tot[];++i)
for(rii j=;j<tot[];++j)
Ans=Ans+(g[i]*c[tot[]][tot[]-i]*g[j]*c[tot[]][tot[]-j]);
}else if(!za&&zb){
for(rii i=;i<tot[];++i)
for(rii j=;j<=tot[];++j)
Ans=Ans+(g[i]*c[tot[]][tot[]-i]*g[j]*c[tot[]][tot[]-j]);
}else {
for(rii i=;i<=tot[];++i)
for(rii j=;j<=tot[];++j)
Ans=Ans+(g[i]*c[tot[]][tot[]-i]*g[j]*c[tot[]][tot[]-j]);
}
pr(Ans);
mint ten;
ten.__=;
ten._[]=;
pr(pw(ten,tot[]+tot[])-Ans);
exit();
}
mint xx,yy;
inline mint gt(li wh){
mint res;
res.__=;
while(wh){
res._[++res.__]=wh%Tot;
wh/=Tot;
}
return res;
}
mint ch(li A,li B){
xx=gt(A),yy=gt(B);
return xx*yy;
}
int main(){
freopen("banal.in","r",stdin);
freopen("banal.out","w",stdout);
memset(P,,sizeof(P));
int n,m;
now[]=now[]=;
tot[]=tot[]=;
za=zb=;
char s;
init();
Get();
n=ra();
for(rii i=;i<=n;++i){
cin>>s;
if(s=='?')a[][i]=-,tot[]++;
else a[][i]=s-'';
if(s=='')za++;
}
for(rii i=;i<=n;++i){
cin>>s;
if(s=='?')a[][i]=-,tot[]++;
else a[][i]=s-'';
if(s=='')zb++;
}
if(za>||zb>){
deal();
return ;
}
clr(dp[][]);clr(dp[][]);
dp[][][][][][]=dp[][][][][][]=;
for(int _=;_<=;_++)
for(rii i=;i<=n;++i){
now[_]^=;
clr(dp[_][now[_]]);
if(a[_][i]!=-){
for(rii p1=;p1<=i*;++p1)
for(rii p2=;p2<=i*;++p2)
for(rii p3=;p3<=i;++p3)
for(rii p4=;p4<=i;++p4){
int P1=p1+P[a[_][i]][],P2=p2+P[a[_][i]][],
P3=p3+P[a[_][i]][],P4=p4+P[a[_][i]][];
dp[_][now[_]][P1][P2][P3][P4]=
dp[_][now[_]][P1][P2][P3][P4]+
dp[_][now[_]^][p1][p2][p3][p4];
}
}else {
for(rii p1=;p1<=i*;++p1)
for(rii p2=;p2<=i*;++p2)
for(rii p3=;p3<=i;++p3)
for(rii p4=;p4<=i;++p4)
for(rii j=;j<=;++j){
int P1=p1+P[j][],P2=p2+P[j][],P3=p3+P[j][],P4=p4+P[j][];
dp[_][now[_]][P1][P2][P3][P4]=
dp[_][now[_]][P1][P2][P3][P4]+
dp[_][now[_]^][p1][p2][p3][p4];
}
}
}
mint Ans;
Ans.__=,Ans._[]=;
for(rii p1=;p1<=n*;++p1)
for(rii p2=;p2<=n*;++p2)
for(rii p3=;p3<=n;++p3)
for(rii p4=;p4<=n;++p4){
Ans=Ans+ch(dp[][now[]][p1][p2][p3][p4],dp[][now[]][p1][p2][p3][p4]);
}
for(rii i=;i<tot[];++i)
for(rii j=;j<tot[];++j)
Ans=Ans+(g[i]*c[tot[]][tot[]-i]*g[j]*c[tot[]][tot[]-j]);
pr(Ans);
mint ten;
ten.__=;
ten._[]=;
pr(pw(ten,tot[]+tot[])-Ans);
return ;
}
100725B Banal Tickets的更多相关文章
- POJ2828 Buy Tickets[树状数组第k小值 倒序]
Buy Tickets Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 19012 Accepted: 9442 Desc ...
- ACM: FZU 2112 Tickets - 欧拉回路 - 并查集
FZU 2112 Tickets Time Limit:3000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u P ...
- Tickets——H
H. Tickets Jesus, what a great movie! Thousands of people are rushing to the cinema. However, this i ...
- POJ 2828 Buy Tickets(线段树 树状数组/单点更新)
题目链接: 传送门 Buy Tickets Time Limit: 4000MS Memory Limit: 65536K Description Railway tickets were d ...
- 【poj2828】Buy Tickets
Description Railway tickets were difficult to buy around the Lunar New Year in China, so we must get ...
- [poj2828] Buy Tickets (线段树)
线段树 Description Railway tickets were difficult to buy around the Lunar New Year in China, so we must ...
- POJ 2828 Buy Tickets
Description Railway tickets were difficult to buy around the Lunar New Year in China, so we must get ...
- Buy Tickets(线段树)
Buy Tickets Time Limit:4000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit ...
- 【poj2828】Buy Tickets 线段树 插队问题
[poj2828]Buy Tickets Description Railway tickets were difficult to buy around the Lunar New Year in ...
随机推荐
- HihoCoder1337 动态第k大(treap)
描述 小Ho:小Hi,之前你不是讲过Splay和Treap么,那么还有没有更简单的平衡树呢? 小Hi:但是Splay和Treap不是已经很简单了么? 小Ho:是这样没错啦,但是Splay和Treap和 ...
- C#获取堆栈信息,输出文件名、行号、函数名、列号等
命名空间:System.Diagnostics 得到相关信息: StackTrace st = new StackTrace(new StackFrame(true));StackFrame sf = ...
- 在.net中读写config文件的各种方法(自定义config节点)
http://www.cnblogs.com/fish-li/archive/2011/12/18/2292037.html 阅读目录 开始 config文件 - 自定义配置节点 config文件 - ...
- 如何让RESTful支持DEL和PUT
RESTful风格里面,@ModelAttribute是一个语义复杂的对象,其中一个就是在所有的被@Controller修饰的方法之前执行: @RequestParam:是指url中“?”之后的que ...
- div+css制作带箭头提示框效果图(原创文章)
一直都在看站友们的作品,今天也来给大家分享一个小的效果,第一次发还有点小紧张呢,语言表达能力不是很好,还请见谅…^ 先来个简单点的吧,上效果图 刚开始在网上看到效果图的时候感觉好神奇,当我试着写出来的 ...
- 深入理解java虚拟机 精华总结(面试)(转)
一.运行时数据区域 3 1.1 程序计数器 3 1.2 Java虚拟机栈 3 1.3 本地方法栈 3 1.4 Java堆 3 1.5 方法区 3 1.6 运行时常量池 4 二. hotspot虚拟机对 ...
- [转载]get_fs()和set_fs()
其实内核里面也可以用系统调用的,直接用read/write是可以的.但要注意几个问题:一个是要记得编译的时候加上-D__KERNEL_SYSCALLS__另外源文件里面要#include如果报错,很可 ...
- Day1--Python基础1--下半部分
一..pyc是什么 1. Python是一门解释型语言? 我初学Python时,听到的关于Python的第一句话就是,Python是一门解释性语言,我就这样一直相信下去,直到发现了*.pyc文件的存在 ...
- 刷题常用的STL容器总结
本文归纳总结刷题常用到STL容器以及一些标准算法,主要包括: string.vector.map.pair.unordered_map.set.queue.priority_queue.stack,以 ...
- 【转】MEAN:Nodejs+express+angularjs+mongodb搭建前端项目框架NJBlog
http://www.cnblogs.com/mz121star/archive/2013/03/13/njblog.html 项目地址:https://github.com/mz121star/ ...