SCOI2011飞镖
来源:互联网 发布:放置江湖安卓修改数据 编辑:程序博客网 时间:2024/04/29 08:06
题目大意:给出k,m,x,需要你做如下操作,你可以选择1-k以内的任何一个数,乘以1,2或3,或者选择m,2*m,询问在3次操作以内是否可以凑出x(几次操作选择的数之和),并且最后一次选择必须选2*某个数(可以为m)。
据说当时那场是把这道题放在了第二天第三题。但却是全场最简单的一道题,更恶心的是,其他两道题都难得变态。估计很多人看到了前两题都被吓着了,想都不敢想这题。
还好我们老师有良心。。考模拟赛的时候把这题放在了第一题的位置。
不废话开始说题了
首先我们抛开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>#define SF scanf#define PF printf#define MAXN 1010using namespace std;int t;long long tot,a[5],b[5],c[5],d[5],k,m,x,k1,m1,x1;bool check1(){ long long kx=k; if(x-k*2<=k*3+k*2&&x-k*2!=k*3+k*2-1) return 1; while((x-kx*2)%3!=0) kx--; if((x-kx*2)<=k*6) return 1; return 0;}bool check2(long long xx){ if(xx<2) return 0; if(xx<=k*3+k*2&&xx!=k*3+k*2-1) return 1; return 0;}bool check3(long long xx){ if(xx>=0&&xx%2==0&&xx/2<=k) return 1; return 0;}bool check4(long long xx){ if(xx<0) return 0; long long kx=k; if(xx<=k*3+k*2&&xx!=k*3+k*2-1) return 1; if(xx%3==0&&xx<=k*6) return 1; return 0;}bool check5(long long xx){ if(xx<0) return 0; if(xx%3==0&&xx/3<=k) return 1; if(xx%2==0&&xx/2<=k) return 1; if(xx<=k) return 1; return 0;}int main(){ freopen("dart.in","r",stdin); freopen("dart.out","w",stdout); SF("%d",&t); SF("%lld%lld%lld%lld%lld",&a[1],&b[1],&c[1],&d[1],&k); SF("%lld%lld%lld%lld%lld",&a[2],&b[2],&c[2],&d[2],&m); SF("%lld%lld%lld%lld%lld",&a[3],&b[3],&c[3],&d[3],&x); for(int i=1;i<=t;i++){ if(check1()) tot++; else if(check2(x-m)||check2(x-2*m)) tot++; else if(check3(x-2*m)||check3(x-3*m)||check3(x-4*m)) tot++; else if(check4(x-2*m)) tot++; else if(check5(x-3*m)||check5(x-4*m)) tot++; else if(x==4*m||x==5*m||x==6*m) tot++; k1=(k*k)%d[1]; k=((k1*a[1])%d[1]+(k*b[1])%d[1]+c[1])%d[1]; m1=(m*m)%d[2]; m=((m1*a[2])%d[2]+(m*b[2])%d[2]+c[2])%d[2]; x1=(x*x)%d[3]; x=((x1*a[3])%d[3]+(x*b[3])%d[3]+c[3])%d[3]; k+=20; m+=20; x+=20; } PF("%lld",tot);}
- SCOI2011飞镖
- 【SCOI2011】【数论】飞镖
- BZOJ2335: [SCOI2011]飞镖
- [scoi2011]糖果
- SCOI2011 糖果
- [SCOI2011] 糖果
- [bzoj2330][scoi2011]
- [SCOI2011]糖果
- [SCOI2011]糖果
- 飞镖和招聘
- 飞镖和招聘
- 飞镖 luther的博客
- lua+cocos2dx飞镖怪物
- Unity3d 忍者飞镖
- 扔飞镖游戏
- 【动态规划】【SCOI2011】股票交易
- BZOJ 2330: [SCOI2011]糖果
- 【BZOJ 2331】 [SCOI2011]地板
- 记:第一篇CSDNBLOG
- PAT 1099
- (转)《Billions》第二季回归,现实中的SAC也回来了
- 调试静态库
- php之clone 复制对象以及__clone魔术方法
- SCOI2011飞镖
- Linux内核分析实验2——一个简单的内核代码分析
- 【错误解决】 java.lang.ClassNotFoundException: org.apache.jsp.WEB_002dINF.classes.views.index_jsp
- android 5.0+6.0新特性
- js 数组移除元素
- React Native之ViewPagerAndroid仿淘宝首页顶部分类布局效果实现
- STL之set
- 读书笔记 effective c++ Item 16 成对使用new和delete时要用相同的形式
- splash爬虫