题目描述

熊猫喜欢吃数,熊猫对与每个数都有他独特的评价。具体来说,熊猫对数 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. C#+Winform开发窗体程序

    学习笔记 第一章:winform基础 一.概述 1.Windows Form(简称WinForm) 是微软.NET平台下用于开发"图形界面"应用程序的组件. 2.C/S架构 客户机 ...

  2. tomcat8080端口占用解决办法

    打开控制台,在窗口中输入指令:netstat -ano | findstr 8080       指令的意思是找出占用8080端口的进程pid 上图中表示占用进程pid为23288,然后再次输入指令: ...

  3. shell脚本结构化语句

    本文中记录一下shell中的两种循环语句:for和while for循环 for循环是linux shell中最常用的结构,for循环有三种结构:1.列表for循环.2.不带列表for循环.3.C风格 ...

  4. 分享spring、spring boot、spring cloud一些学习资源,从基础知识到项目实战

    1.spring注解驱动开发,学习spring boot和spring cloud必备知识 链接: https://pan.baidu.com/s/1xhULzLlpkERhoMi1G5Lgfg 密码 ...

  5. Ansible学习 ad-hoc命令

    Ansible提供两种方式去执行命令,一种是ad-hoc命令,一种是写入Ansible playbook.类似于前者在命令行敲shell,后者是写shell-script脚本,前者解决一些简单的任务, ...

  6. (转)Unity 和 Cocos2d-x 越渐流行,国内公司开发「自研游戏引擎」的意义何在?

    分几个角度来说:一.我认为,Unity3D将无可挽回的,或者说,势在必得的,成为接下来很多年内,世界移动领域游戏引擎市场霸主.回顾历史,正如同咱们经历过一次又一次的互联网时代变革一样,x86,wind ...

  7. linux poll用法

    相对于select来说,poll 也是在指定时间内论询一定数量的文件描述符,来测试其中是否有就绪的,不过,poll 提供了一个易用的方法,来实现 i/o 复用. 声明如下: #include < ...

  8. Pandas 基本技巧

    1.数据查看和转置 import numpy as np import pandas as pd # 导入numpy.pandas模块 # 数据查看.转置 df = pd.DataFrame(np.r ...

  9. [USACO12JAN]视频游戏的连击Video Game Combos(AC自动机+DP)

    Description 贝西正在打格斗游戏.游戏里只有三个按键,分别是“A”.“B”和“C”.游戏中有 N 种连击 模式,第 i 种连击模式以字符串 Si 表示,只要贝西的按键中出现了这个字符串,就算 ...

  10. 【UE4】二十四、UE4内部版本引擎和官方版本引擎版本保持兼容的方法

    内部使用的引擎和官方正式发布的引擎版本号不一致,这种情况会导致一些插件由于版本不一致无法使用,有其是在没有插件源码的情况下.解决方法为 修改Engine\Source\Runtime\Launch\R ...