NC20286. [SCOI2011]飞镖
描述
输入描述
输出描述
一行,包括一个数字,表示这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; }