题目描述

熊猫喜欢吃数,熊猫对与每个数都有他独特的评价。具体来说,熊猫对数 xx 的评价是个四元组 (a, b, c, d)(a,b,c,d),计算方式如下:

首先将 xx 写成二进制形式(不含前导零),然后将这作为一个字符串,那么 a =a= 子串 “00”“00” 的数量,b =b= 子串 “01”“01” 的数量,c =c= 子串 “10”“10” 的数量,d =d= 子串 “11”“11” 的数量。

现在熊猫想吃掉区间 [A,B] 之间所有评价是 (a, b, c, d)(a,b,c,d) 的数,由于你被熊猫抓了起来,所以他要你回答他能吃到多少个数。如果你回答不出,他就只好吃你。

输入格式

第一行一个 0101 串为 AA 的二进制表示。

第一行一个 0101 串为 BB 的二进制表示。

第三行四个数 a, b, c, da,b,c,d。

输出格式

一个数表示答案,对 10000000071000000007 取模。

样例

样例输入 1

10
1001
0 0 1 1

样例输出 1

1

数据范围与提示

子任务一(13pts):B ≤ 2^{20}B≤220。

子任务二(15pts):B ≤ 2^{100}B≤2100。

子任务三(19pts):B ≤ 2^{1000}B≤21000。

子任务四(15pts):A = 1, B = 2^k − 1A=1,B=2k−1。

子任务五(38pts):无特殊限制。

对于所有的数据,1 ≤ A ≤ B ≤ 2^{100000}, a + b + c + d ≤ 10^51≤A≤B≤2100000,a+b+c+d≤105。

来源

2019年1月雅礼集训
 

solution
我们可以用abcd算出区间长,需要多少0(s0),这些0分成几段(n0),需要多少1(s1),这些1分成几段(n1),
我们先不考虑限制。
考虑插板法,0的方案为C(s0-1,n0-1)
方案数C(s0-1,n0-1)*C(s1-1,n1-1)
有限制的就从第1为开始像数位dp一样记上下界有没有顶满。
如果都没顶满就直接算。
这样效率就2n了
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#define maxn 100005
#define mod 1000000007
#define ll long long
using namespace std; int n,la,lb,a,b,c,d,n0,n1,s0,s1;
char A[maxn],B[maxn];
ll h[maxn],ny[maxn],ans;
ll work(ll a,int num){
ll ans=;
while(num){
if(num&)ans=ans*a;
a=a*a;a%=mod;ans%=mod;num>>=;
}
return ans;
}
void pre(){
n=; h[]=;for(int i=;i<=n;i++)h[i]=h[i-]*i%mod;
ny[n]=work(h[n],mod-);
for(int i=n-;i>=;i--){
ny[i]=ny[i+]*(i+)%mod;
}
}
void Pd(){
if(n>la){
A[]='';for(int i=;i<=n;i++)A[i]='';
}
if(n<la){puts("");exit();}
if(n>lb){puts("");exit();}
if(n<lb){
for(int i=;i<=n;i++)B[i]='';
}
}
ll C(int N,int M){
if(N<||M<||N<M)return ;
return h[N]*ny[M]%mod*ny[N-M]%mod;
}
void calc(int n0,int s0,int n1,int s1){
ll w0=C(s0-,n0-),w1=C(s1-,n1-);
if(s0==&&n0==)ans+=w1;
if(s1==&&n1==)ans+=w0;
ans=ans+w0*w1%mod;ans%=mod;
}
void solve(int i,int la,bool fa,bool fb,int n0,int s0,int n1,int s1){
if((n0==&&s0>)||(n1==&&s1>))return;
if(i==n+){
if(n0==&&la==&&!n1&&!s1&&!s0)ans++;
if(n1==&&la==&&!n0&&!s0&&!s1)ans++;
ans%=mod;
return;
}
if(!fa&&!fb){
calc(n0,s0,n1,s1);
if(la==)calc(n0-,s0,n1,s1);
if(la==)calc(n0,s0,n1-,s1);
return;
} if(s0<||n0<||s1<||n1<)return;
if(i==)solve(i+,,fa,fb,n0,s0,n1,s1-);
else { if(!fa||A[i]==''){
if(la==)solve(i+,,fa,fb&(B[i]==''),n0,s0-,n1-,s1);
else solve(i+,,fa,fb&(B[i]==''),n0,s0-,n1,s1);
}
if(!fb||B[i]==''){
if(la==)solve(i+,,fa&(A[i]==''),fb,n0-,s0,n1,s1-);
else solve(i+,,fa&(A[i]==''),fb,n0,s0,n1,s1-);
}
}
} int main()
{
pre();
scanf(" %s",A+);la=strlen(A+);
scanf(" %s",B+);lb=strlen(B+); scanf("%d%d%d%d",&a,&b,&c,&d);
n=a+b+c+d+;
Pd();ans=;
if(b==c){
n0=b;n1=n0+;
s0=a+n0,s1=d+n1;
solve(,,,,n0,s0,n1,s1);
printf("%lld\n",ans);
}
else if(b+==c){
n0=n1=c;
s0=a+n0,s1=d+n1;
solve(,,,,n0,s0,n1,s1);
printf("%lld\n",ans);
}
else puts("");
return ;
}
 

熊猫(i)的更多相关文章

  1. 聚光灯下的熊猫TV技术架构演进

    2015年开始的百播大战,熊猫TV是其中比较特别的一员. 说熊猫TV是含着金钥匙出生的公子哥不为过.还未上线,就频频曝光,科技号,微博稿,站上风口浪尖.内测期间更是有不少淘宝店高价倒卖邀请码,光内测时 ...

  2. 爬取熊猫TV,javascript,selenium,模拟点击

    from selenium import webdriver import csv def get_pages_numger(browser): res = browser.find_elements ...

  3. swift语言实战晋级-第9章 游戏实战-跑酷熊猫-9-10 移除平台与视差滚动

    9.9 移除场景之外的平台 用为平台是源源不断的产生的,如果不注意销毁,平台就将越积越多,虽然在游戏场景中看不到.几十个还看不出问题,那几万个呢?几百万个呢? 所以我们来看看怎么移除平台,那什么样的平 ...

  4. Swift语言实战晋级-第9章 游戏实战-跑酷熊猫-4 熊猫的跳和打滚

    之前我们学会了跑的动作,现在我们可以利用同样的方法来实现了跳和打滚的动画. …… class Panda : SKSpriteNode { …… //跳的纹理集合 let jumpAtlas = SK ...

  5. Swift语言实战晋级-第9章 游戏实战-跑酷熊猫-3 显示一个动态的熊猫

    一个静态的熊猫明显不能满足我们的欲望,接下来我们就让熊猫跑起来.序列帧动画的原理就是不停的切换不同的图片.当我们将一张一张的切换Panda类的跑动文理后,熊猫就跑起来了.那么首先我们需要一个数组常量来 ...

  6. Swift语言实战晋级-第9章 游戏实战-跑酷熊猫-2 创建熊猫类

    当我们创建好项目文件后我们就可以开始一步一步的按照我们之前列入的清单来编写我们的游戏.现在就让我们来创建一个熊猫这个类Panda.swift.我们将采取分解的方式,一步一步的完成Panda.swift ...

  7. Swift语言实战晋级-第9章 游戏实战-跑酷熊猫-1

    学习目标 一.进一步学习Swift的游戏制作 二.掌握SKNode,SKSpriteNode的运用 三.了解SpriteKit的物理系统 四.掌握动作(SKAction)的运用 在这一章,我们要通过制 ...

  8. Swift游戏实战-跑酷熊猫 14 熊猫打滚

    这节内容我们来实现熊猫打滚.思路是这样的,当熊猫起跳时记录他的Y坐标,落到平台上的时候再记录它的Y坐标.两个坐标之间的差要是大于一定数值就判断它从高处落下要进行打滚缓冲.至此跑酷熊猫已经像一个游戏的样 ...

  9. Swift游戏实战-跑酷熊猫 13 二段跳的实现

    这节内容我们来实现熊猫的二段跳. 要点: 二段跳的逻辑: 逻辑一,第一次点击屏幕,status就会变成jump. 逻辑二,第二次点击屏幕,status就会变成jump2. 逻辑三,当status变成j ...

  10. Swift游戏实战-跑酷熊猫 12 与平台的碰撞

    这节主要实现熊猫和平台的碰撞,实现熊猫在平台上奔跑 要点 对平台进行物理属性设置 //设置物理体以及中心点 self.physicsBody = SKPhysicsBody(rectangleOfSi ...

随机推荐

  1. MySql开启GTID和多线程复制功能

    1.修改参数 master: gtid_mode = ON                        --开启gtid这个必须打开 enforce-gtid-consistency = ON    ...

  2. .NET 客户IP地址捕捉

    MVC模式下要获取客户IP可以在ActionFilterAttribute中进行拦截 filterContext.HttpContext.Request.UserHostAddress 同样,在Web ...

  3. php-5.6.26源代码 - 扩展模块的种类,扩展模块的执行埋点

    模块种类(两种) 类型一:zend的模块:(类似zend_extension=test.so) 识别方法: php.ini中以zend_extension开头的配置,如zend_extension=t ...

  4. PHP关闭notice级别的错误提示

    1.在php.ini文件中改动error_reporting改为: error_reporting=E_ALL & ~E_NOTICE 2.如果你不能操作php.ini文件,你可以使用如下方法 ...

  5. LInux操作随手笔记

    一.find 的用法 实例 find / -name test.txt 就可以找到这个文件的路径(如果存在). 二.学用vi编辑器,学用rz往linux服务器上面上传文件 linux中rz 和 sz ...

  6. python-含参函数

    #!/usr/local/bin/python3 # -*- coding:utf-8 -*- ''' #----------函数位置参数和关键字参数---------- def test(x,y): ...

  7. pyhton,数据类型

    标准数据类型 Python3 中有六个标准的数据类型: Number(数字) String(字符串) Tuple(元组) List(列表) Sets(集合) Dictionary(字典) 重点是: 类 ...

  8. J.U.C 系列之Atomic原子类

    一 什么是原子类? 所谓原子类必然是具有原子性的类,原子性操作--原子操作,百度百科中给的定义如下 "原子操作(atomic operation)是不需要synchronized" ...

  9. 9.2python操作redis

    Redis redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorte ...

  10. 8 实现10mins用户登录与注册

    1.重新认识登录 2.实现登录功能 (1)Django 自带的authenticate, login模块 from django.contrib.auth import authenticate, l ...