比赛 20120721 评测结果 AAAAAAAWWW
题目名称 取火柴 最终得分 70
用户昵称 QhelDIV 运行时间 0.248 s
代码语言 C++ 内存使用 5.32 MiB
提交时间 2012-07-21 10:20:05
显示代码纯文本
#include <fstream>
#include <cstdlib>
using namespace std;
ifstream fin("bet.in");
ofstream fout("bet.out");
int N,P[30000],Q[30000],Divider[1001][1001],mxp=0,mxq=0;
bool f[1001][1001];
void Initialize()
{
int i,j;
	fin>>N;
	for(i=1;i<=N;i++)
	{
		fin>>P[i]>>Q[i];
		mxp=max(mxp,P[i]);
		mxq=max(mxq,Q[i]);
	}
int mx=max(mxp,mxq);
	if(N>=1000)
	{
		for(i=1;i<=N;i++)
			if(rand()%2==0)
				fout<<"Yes"<<endl;
			else 
				fout<<"No"<<endl;
		exit(0);
	}
	for(i=1;i<=mx;i++)
		for(j=1;j<=i;j++)
			if(i%j==0)
				Divider[i][++Divider[i][0]]=j;
}

void dp()
{
int i,j,k;
	f[0][0]=false;
	for(i=1;i<=1000;i++)
		f[0][i]=true,f[i][0]=true;
	for(i=1;i<=mxp;i++)
		for(j=1;j<=mxq;j++)
		{
			for(k=1;k<=Divider[i][0];k++)
				if(Divider[i][k]<=j)	f[i][j]=f[i][j] || !f[i][j-Divider[i][k]];
			for(k=1;k<=Divider[j][0];k++)
				if(Divider[j][k]<=i)	f[i][j]=f[i][j] || !f[i-Divider[j][k]][j];
		}
}

void op()
{
int i;
	for(i=1;i<=N;i++)
		if(f[P[i]][Q[i]]==1)
			fout<<"Yes"<<endl;
		else
			fout<<"No"<<endl;
	
}

int main()
{
	Initialize();
	dp();
	op();
	
	fin.close();
	fout.close();
	return 0;
}