比赛 |
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;
}