很罕见的不好做的模拟题。
情况很多,不容易考虑全面。
可以先把问题简化,然后逐步加深,这样有利于思考问题。
对这道题来说,可以先考虑不打红心的情况,再考虑打红心的情况。
考虑打红心又分为打M,2M,3M,4M的情况,这样就不容易出错。做题一定要细心,考虑全面。
代码:
#include<cstdio>
#include<cstring>
using namespace std;
long long A1,B1,C1,D1,A2,B2,C2,D2,A3,B3,C3,D3;
long long X1,K1,M1,X,K,M;
int T;
int ans = 0;
void init()
{
freopen("bzoj2335.in","r",stdin);
freopen("bzoj2335.out","w",stdout);
}
inline long long max(long long a,long long b)
{
return a > b ? a : b;
}
void solve()
{
bool suc = false;
if(X >= 2 && X <= 8 * K && X != 8 * K - 1)suc = true;
if(X % M == 0 && X / M >= 2 && X / M <= 6)suc = true;
if(X >= M)
{
X -= M;
if(X >= 2 && X <= 5 * K && X != 5 * K - 1)suc = true;
if(X >= M)
{
X -= M;
if(X > 0 && X % 2 == 0 && X / 2 <= K)suc = true;
if(X <= 5 * K && X != 5 * K - 1)suc = true;
if(X <= 6 * K && X % 3 == 0)suc = true;
if(X >= M)
{
X -= M;
if(X <= K)suc = true;
if(X % 2 == 0 && X / 2 <= K)suc = true;
if(X % 3 == 0 && X / 3 <= K)suc = true;
if(X >= M)
{
X -= M;
if(X <= K)suc = true;
if(X % 2 == 0 && X / 2 <= K)suc = true;
if(X % 3 == 0 && X / 3 <= K)suc = true;
}
}
}
}
if(suc)ans++;
}
void readdata()
{
scanf("%d",&T);
scanf("%lld%lld%lld%lld%lld",&A1,&B1,&C1,&D1,&K1);
scanf("%lld%lld%lld%lld%lld",&A2,&B2,&C2,&D2,&M1);
scanf("%lld%lld%lld%lld%lld",&A3,&B3,&C3,&D3,&X1);
while(T--)
{
X = X1,M = M1,K = K1;
solve();
K1 = ((((A1 * K1) % D1) * K1) % D1 + (B1 * K1) % D1 + C1) % D1 + 20;
M1 = ((((A2 * M1) % D2) * M1) % D2 + (B2 * M1) % D2 + C2) % D2 + 20;
X1 = ((((A3 * X1) % D3) * X1) % D3 + (B3 * X1) % D3 + C3) % D3 + 20;
}
printf("%d\n",ans);
}
int main()
{
init();
readdata();
return 0;
}