比赛 20110727 评测结果 AAAAAAAATAATTT
题目名称 猴子和香蕉 最终得分 71
用户昵称 .Xmz 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2011-07-27 12:41:47
显示代码纯文本
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <set>
#define ll long long
using namespace std;

int n,m,x[1001],y[1001],K;
bool hash[2000001];

void init()
{
	scanf("%d%d",&n,&m);
	for (int i=1;i<=m;i++) scanf("%d%d",&x[i],&y[i]);
	scanf("%d",&K);
}

set <int> S[2],ANS;

void solve()
{
	S[0].insert(0);
	int maxans=1e9;
	for (int T=1;T<=n;T++)
	{
		int o = T & 1;
		S[o].clear();
		for (set<int>::iterator t=S[!o].begin();t!=S[!o].end();t++)
		{
			int a=*t;
			for (int i=1;i<=m;i++)
			if ( a % (x[i]-1) == 0 )
			{
				ll b = (ll)a*(ll)x[i]/(ll)(x[i]-1)+(ll)y[i];
				if (b<=1e9 && b!=0)
				{
					if ( ANS.size()==K && b >=maxans ) ;
					else
					{
						if ( (b<=2000000 && !hash[b]) || ANS.count(b)==0)
						{
							S[o].insert(b);
							if (S[o].size()>K) S[o].erase(--S[o].end());
							ANS.insert(b);
							if (b<=2000000) hash[b]=true;
							if (ANS.size()>K) 
							{
								ANS.erase(--ANS.end());
								maxans=*--ANS.end();
							}
						}
					}
				}
			}
		}
	}
	if (ANS.size()<K) printf("-1\n");
	else printf("%d\n",*--ANS.end());
}

int main()
{
	freopen("monkeys.in","r",stdin);
	freopen("monkeys.out","w",stdout);
	init();
	solve();
	return 0;
}