列表

详情


NC20286. [SCOI2011]飞镖

描述

飞镖是在欧洲颇为流行的一项运动。它的镖盘上分为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分。同样的,最后一镖必须是双倍(包括大红心)。

输入描述

输出描述

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

示例1

输入:

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

输出:

4

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++11(clang++ 3.9) 解法, 执行用时: 240ms, 内存消耗: 384K, 提交时间: 2020-02-14 15:53:59

#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;
}

上一题