zoukankan      html  css  js  c++  java
  • 飞镖(bzoj 2335)

    Description

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

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

    现在,lxhgww把原来的120分的分值变为了1K分,同时把小红心的分数变为了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[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(){
        scanf("%d",&t);
        scanf("%lld%lld%lld%lld%lld",&a[1],&b[1],&c[1],&d[1],&k);
        scanf("%lld%lld%lld%lld%lld",&a[2],&b[2],&c[2],&d[2],&m);
        scanf("%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;
        }
        printf("%lld",tot);
        return 0;
    }
  • 相关阅读:
    在HttpHandlers (ASHX files)中使用Session
    EventCalendar控件源码和ASP.NET 2.0 Beta 2 Starter Kits中可能遇到的问题
    C# 获取数据库中某个某个表的创建脚本[原创]
    Linq 合并多个查询条件
    自定义WCF RIA Services 超时时间
    也来学学插件式开发续利用MEF
    HTML5程序设计 Geolocation API
    反射实体模型生成Oracle SQL脚本
    Entity Framework With Oracle
    Entity Framework Code First在Oracle下的伪实现
  • 原文地址:https://www.cnblogs.com/harden/p/6746353.html
Copyright © 2011-2022 走看看