Description

飞镖是在欧洲颇为流行的一项运动。它的镖盘上分为20个扇形区域,分别标有1到20的分值,每个区域中有单倍、双倍和三倍的区域,打中对应的区域会得到分值乘以倍数所对应的分数。例如打中18分里面的三倍区域,就会得到54分。另外,在镖盘的中央,还有“小红心”和“大红心”,分别是25分和50分。

通常的飞镖规则还有一条,那就是在最后一镖的时候,必须以双倍结束战斗,才算获胜。也就是说,当还剩12分的时候,必须打中双倍的6才算赢,而打中单倍的12或者三倍的4则不算。特别的,“大红心”也算双倍(双倍的25)。在这样的规则下,3镖能解决的最多分数是170分(两个三倍的20,最后用大红心结束)。

现在,lxhgww把原来的1到20分的分值变为了1到K分,同时把小红心的分数变为了M分(大红心是其双倍),现在lxhgww想知道能否在3镖内(可以不一定用满3镖)解决X分。同样的,最后一镖必须是双倍(包括大红心)。

Input

Output

一行,包括一个数字,表示这T组数据中,能够被解决的数据数目。

Sample Input

5
1 2 2 10 20
1 3 2 15 25
2 2 5 200 170

Sample Output

4

HINT

1<=T<=1000000,20<=K1,M1,X1,D1,D2,D3<=10^9

0<=A1,B1,C1,A2,B2,C2,A3,B3,c3<=10^9

/*
首先我们抛开m不论。
不难发现一个性质:两次分别选择2*k,3*k,就可以凑出2*k+3*k以内除了2*k+3*k-1以外所有的数。
证明起来很简单,要凑2*k+3*k-1,就必须得用2*(k+1)+3*(k-1),可是k+1超过了范围,不合法。
2*k+3*k-2,即2*(k-1)+3*k.
2*k+3*k-3,即2*k+3*(k-1).
2*k+3*k-4,即2*(k-1)+3*k.
2*k+3*k-5,即2*(k-1)+3*(k-1).
此后每5个数即为一次循环,都能够凑出来(1是特例,但可以直接用一次1*1得到,所以不用在意)
那么能凑出比2*k+3*k还大的数,就只能选3*a+3*b这种方式,这种方式能凑出来的数规律很显然,即为3的倍数,且小于等于3*k+3*k。
所以,对于任何一个数,用这两种方式凑都是最优的。
因此,我们将x-2*k,看是否可以用2*a+3*b来凑
并且找到x-2*k1,为k1<=k且x-2*k1为3的倍数,看是否可以用3*k+3*k来凑 那么现在加入m
总结一下,有m参与的共计有11种情况:
(i表示选1-k中的数,乘的倍数不论,竖线后为最后一次,前两次操作的顺序随意)
①m i | i
②2m i | i
③m m | i
④m 2m | i
⑤2m 2m | i
⑥i i | 2m
⑦m i | 2m
⑧2m i | 2m
⑨m m | 2m
⑩m 2m | 2m
?2m 2m |2m
将m与2m看做同一种数,可以将1,2归为一类,记为A
3,4,5归为一类,记为B
6单独为一类,记为C
7,8为一类,记为D
9,10,11为一类,记为E
对于A类,只需要将x-m或2m,因为最后一次必为2*a,所以用2*a+3*b的方法判定即可
(注意!这里x-m,x-2m不可为0!因为题目要求的是从1-k内的数中选,如果m==x就会出现不合法的局面)
对于B类,将x-2m(m+m)或3m(m+2m)或4m(2m+2m),看剩下的数是否为2的倍数且在2*k范围内
对于C类,将x-2m后,看能否用2*a+3*b,或者3*a+3*b的方法即可
对于D类 ,将x-2m或3m后,是否为1-k中某个数本身或2倍,3倍
对于E类,直接看x是否等于4m,5m,6m。
*/
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int t;
long long tot,a[],b[],c[],d[],k,m,x,k1,m1,x1;
bool check1(){
long long kx=k;
if(x-k*<=k*+k*&&x-k*!=k*+k*-) return ;
while((x-kx*)%!=) kx--;
if((x-kx*)<=k*) return ;
return ;
}
bool check2(long long xx){
if(xx<) return ;
if(xx<=k*+k*&&xx!=k*+k*-) return ;
return ;
}
bool check3(long long xx){
if(xx>=&&xx%==&&xx/<=k) return ;
return ;
}
bool check4(long long xx){
if(xx<) return ;
long long kx=k;
if(xx<=k*+k*&&xx!=k*+k*-) return ;
if(xx%==&&xx<=k*) return ;
return ;
}
bool check5(long long xx){
if(xx<) return ;
if(xx%==&&xx/<=k) return ;
if(xx%==&&xx/<=k) return ;
if(xx<=k) return ;
return ;
}
int main(){
scanf("%d",&t);
scanf("%lld%lld%lld%lld%lld",&a[],&b[],&c[],&d[],&k);
scanf("%lld%lld%lld%lld%lld",&a[],&b[],&c[],&d[],&m);
scanf("%lld%lld%lld%lld%lld",&a[],&b[],&c[],&d[],&x);
for(int i=;i<=t;i++){
if(check1()) tot++;
else if(check2(x-m)||check2(x-*m)) tot++;
else if(check3(x-*m)||check3(x-*m)||check3(x-*m)) tot++;
else if(check4(x-*m)) tot++;
else if(check5(x-*m)||check5(x-*m)) tot++;
else if(x==*m||x==*m||x==*m) tot++;
k1=(k*k)%d[];
k=((k1*a[])%d[]+(k*b[])%d[]+c[])%d[];
m1=(m*m)%d[];
m=((m1*a[])%d[]+(m*b[])%d[]+c[])%d[];
x1=(x*x)%d[];
x=((x1*a[])%d[]+(x*b[])%d[]+c[])%d[];
k+=;m+=;x+=;
}
printf("%lld",tot);
return ;
}

飞镖(bzoj 2335)的更多相关文章

  1. [SCOI2011]飞镖[数学模拟]

    2335: [SCOI2011]飞镖 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 482  Solved: 152[Submit][Status][ ...

  2. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  3. BZOJ 2127: happiness [最小割]

    2127: happiness Time Limit: 51 Sec  Memory Limit: 259 MBSubmit: 1815  Solved: 878[Submit][Status][Di ...

  4. BZOJ 3275: Number

    3275: Number Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 874  Solved: 371[Submit][Status][Discus ...

  5. BZOJ 2879: [Noi2012]美食节

    2879: [Noi2012]美食节 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1834  Solved: 969[Submit][Status] ...

  6. bzoj 4610 Ceiling Functi

    bzoj 4610 Ceiling Functi Description bzoj上的描述有问题 给出\(n\)个长度为\(k\)的数列,将每个数列构成一个二叉搜索树,问有多少颗形态不同的树. Inp ...

  7. BZOJ 题目整理

    bzoj 500题纪念 总结一发题目吧,挑几道题整理一下,(方便拖板子) 1039:每条线段与前一条线段之间的长度的比例和夹角不会因平移.旋转.放缩而改变,所以将每条轨迹改为比例和夹角的序列,复制一份 ...

  8. 【sdoi2013】森林 BZOJ 3123

    Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数.第三行包含N个非负整数 ...

  9. 【清华集训】楼房重建 BZOJ 2957

    Description 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些 ...

随机推荐

  1. Python容器--list, tuple, dict, set

    ## Python 中有四种用于存放数据的序列--list, tuple, dict, set ## list 列表 - 可以存放任意类型数据的有序序列 - 列表可以由零个或多个元素组成,元素之间用逗 ...

  2. 呕心沥血写的python猜数字

    #猜数字 import random num_rd=random.randint(0,100) count=1 while 1<=count<=10: num_ip=input('请输入0 ...

  3. HyperLedger Fabric 1.4 比特币历史(1.1)

    比特币是一种数字货币,也是一种创新思维,把人们带入到一个无中心化.完全可信任.安全可靠的全新思维领域:一个叫“中本聪”的人或组织,使我们思维产生化学反应,他在2008年10月31日发表了比特币白皮书& ...

  4. [BZOJ2120]数颜色(莫队算法)

    Description 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜 ...

  5. Permute Digits 915C

    You are given two positive integer numbers a and b. Permute (change order) of the digits of a to con ...

  6. 点击EditText可编辑,点击其他地方不可编辑

    我是在Fragment中实现的,在网上查了,有的说要回调Activity的onTouch事件,通过实验直接在Fragment中即可.如下: 我的EditText在ScrollView,因为Scroll ...

  7. linux环境下kettle部署(JDK安装配置,kettle安装配置,资源库配置,定时执行job)

    一.部署准备 1.1 java安装(略) 1.2 JDK配置 1.     命令行键入“cd /etc”进入etc目录 2.     命令行键入“vi profile”打开profile文件 3.   ...

  8. 关于Android SDK无法更新的解决办法

    最新摆弄PhoneGap打包,所以需要安卓的环境,配置后,sdk更新实在是在慢了,上网找了一下,可能被强了,所有总结如下办法,最后弄好了,跟大家分享一下 具体步骤:1:打开SDK Manager.ex ...

  9. android gradle.properties

    gradle.properties 里面配置的东西,在gradle 文件里面可以直接引用. 例如: 在你工程根目录的gradle.properties 文件里面 可以这样配置: ## Project- ...

  10. android stadio open recent 在同一窗口打开

    Android staido 有一个功能是open recent ,默认是下面这样的: 就出来一个框,给你选择,是在新的窗口打开,还是在当前窗口打开.如果你选了当前窗口,并且点了Remember,do ...