2335: [SCOI2011]飞镖

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 482  Solved: 152
[Submit][Status][Discuss]

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-3m或4m后,是否为1-k中某个数本身或2倍,3倍 
对于E类,直接看x是否等于4m,5m,6m。

#include<cstdio>
using namespace std;
typedef long long ll;
ll A[],B[],C[],D[],S[];
ll K,M,X;int T,tot;
inline ll read(){
ll x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
bool check(){
ll kx=K;
if(X-*K<=K*+K*&&X-*K!=K*+K*-) return ;
while((X-*kx)%) kx--;
if((X-*kx)<=K*) return ;
return ;
}
bool checkA(ll x){
if(x<) return ;
if(x<=K*+K*&&x!=K*+K*-) return ;
return ;
}
//慎用除法
bool checkB(ll x){
if(x<) return ;
if(x%==&&x<=K*) return ;
return ;
}
bool checkC(ll x){
if(x<) return ;
if(x<=K*+K*&&x!=K*+K*-) return ;
if(x%==&&x<=K*) return ;
return ;
}
bool checkD(ll x){
if(x<) return ;
if(x<=K) return ;
if(x%==&&x<=K*) return ;
if(x%==&&x<=K*) return ;
return ;
}
int main(){
// freopen("sh.txt","r",stdin);
T=read();
for(int i=;i<=;i++) A[i]=read(),B[i]=read(),C[i]=read(),D[i]=read(),S[i]=read();
K=S[];M=S[];X=S[];
for(int i=;i<=T;i++){
if(check()) tot++;
else if(checkA(X-M)||checkA(X-*M)) tot++;
else if(checkB(X-*M)||checkB(X-*M)||checkB(X-*M)) tot++;
else if(checkC(X-*M)) tot++;
else if(checkD(X-*M)||checkD(X-*M)) tot++;
else if(X==*M||X==*M||X==*M) tot++;
K=(K*K%D[]*A[]%D[]+K*B[]%D[]+C[]%D[])%D[]+;
M=(M*M%D[]*A[]%D[]+M*B[]%D[]+C[]%D[])%D[]+;
X=(X*X%D[]*A[]%D[]+X*B[]%D[]+C[]%D[])%D[]+;
}
printf("%d\n",tot);
return ;
}
 

[SCOI2011]飞镖[数学模拟]的更多相关文章

  1. bzoj AC倒序

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

  2. bzoj2330: [SCOI2011]糖果

    2330: [SCOI2011]糖果 Time Limit: 10 Sec Memory Limit: 128 MB Description 幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友 ...

  3. BZOJ 2330: [SCOI2011]糖果 [差分约束系统] 【学习笔记】

    2330: [SCOI2011]糖果 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 5395  Solved: 1750[Submit][Status ...

  4. 【bzoj2333】 [SCOI2011]棘手的操作 可并堆+lazy标记

    2016-05-31  21:45:41 题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2333 (学习了黄学长的代码 有如下操作: U x y ...

  5. Project Euler 109 :Darts 飞镖

    Darts In the game of darts a player throws three darts at a target board which is split into twenty ...

  6. 【BZOJ 2333 】[SCOI2011]棘手的操作(离线+线段树)

    2333: [SCOI2011]棘手的操作 Description 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i],接下来有如下一些操作: U x y: 加一条边 ...

  7. bzoj 2331: [SCOI2011]地板 插头DP

    2331: [SCOI2011]地板 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 541  Solved: 239[Submit][Status] D ...

  8. bzoj 2330 [SCOI2011]糖果(差分约束系统)

    2330: [SCOI2011]糖果 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3574  Solved: 1077[Submit][Status ...

  9. BZOJ 2330: [SCOI2011]糖果( 差分约束 )

    坑爹...要求最小值要转成最长路来做.... 小于关系要转化一下 , A < B -> A <= B - 1 ------------------------------------ ...

随机推荐

  1. 限定某个目录禁止解析php 限制user_agent php相关配置

  2. Redis锁的简单应用

    本文版权归博客园和作者本人吴双共同所有 .转载爬虫请注明地址,博客园蜗牛 http://www.cnblogs.com/tdws/p/5712835.html 蜗牛Redis系列文章目录http:// ...

  3. Java JVM运行时数据区,内存管理和GC垃圾回收

    一 . 运行时数据区 程序计数器是线程私有的,是一块很小的内存空间,是当前线程执行到字节码行号的计数指示器.每个CPU处理器核心 在任何一个时刻,都只可能运行着唯一的一个线程,执行着一条指令.所以在多 ...

  4. Linq 查询某个字段为null的数据

    如tb_flag 数据结构如下:flag int null 不能使用:flag==null 生成的SQL语句为 where flag=null   建议使用:可空类型 用Nullable<T&g ...

  5. Node.js之 EventLoop 理解(转)

    关于Node.js的第一个基本概念是I/O操作开销是巨大的: 所以,当前变成技术中最大的浪费来自于等待I/O操作的完成.有几种方法可以解决性能的影响: 同步方式:按次序一个一个的处理请求.利:简单:弊 ...

  6. UGUI优化

    https://zhuanlan.zhihu.com/p/21913747 https://www.jianshu.com/p/3edce67cb473 http://www.ceeger.com/f ...

  7. Unity对象池管理

    链接: http://www.xuanyusong.com/archives/2925 http://www.xuanyusong.com/archives/2974 https://www.cnbl ...

  8. 查询SQL阻塞语句

    SELECT SPID=p.spid, DBName = convert(CHAR(),d.name), ProgramName = program_name, LoginName = convert ...

  9. vim分屏

    使用vim分屏的时候 ,可以在终端直接输入 vim -On 1.php 2.php 3.php 垂直分屏 三个文件 如果是在某个窗口里面想打开另外一个文件如何做呢? 按下esc,然后按下冒号 输入 回 ...

  10. python与VScode

    用VScode写python是非常方便的.vscode是一个功能非常强大的编辑器,下面介绍大致的使用方法: 下载安装python,配置环境变量. 下载安装VScode(vscode会自动连接pytho ...