【SCOI2011】【数论】飞镖

15 篇文章 0 订阅

罕见的不好做的模拟题。

情况很多,不容易考虑全面。

可以先把问题简化,然后逐步加深,这样有利于思考问题。

对这道题来说,可以先考虑不打红心的情况,再考虑打红心的情况

考虑打红心又分为打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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值