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;
    }
  • 相关阅读:
    对象池使用时要注意几点
    Flash3D学习计划(一)——3D渲染的一般管线流程
    714. Best Time to Buy and Sell Stock with Transaction Fee
    712. Minimum ASCII Delete Sum for Two Strings
    647. Palindromic Substrings(马拉车算法)
    413. Arithmetic Slices
    877. Stone Game
    338. Counting Bits
    303. Range Sum Query
    198. House Robber
  • 原文地址:https://www.cnblogs.com/harden/p/6746353.html
Copyright © 2011-2022 走看看