比赛 20100927 评测结果 WAAWAWTWWW
题目名称 细胞分裂 最终得分 30
用户昵称 Citron酱 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2010-09-27 21:56:01
显示代码纯文本
#include <fstream>
#include <cmath>

#define I_F "cell.in"
#define O_F "cell.out"
#define MAX 10000

using namespace std;

int n,m1,m2,pnl,pl=1,ans=MAX;
int p[MAX]={2};
int pn[MAX];
int pns[MAX];

ifstream fin(I_F);

void Getp();
void Getpy(long x, int &l, int n[MAX], int s[MAX]);
void Input();
bool Pd(int &l, int n[MAX], int s[MAX]);
void Search();
void Output();

int main()
{
	Input();
	Search();
	Output();
	return 0;
}

void Getp()
{
	int i,j;
	bool flag;
	for (i=3; i<m1; i+=2)
	{
		flag=true;
		for (j=0; ((j<pl)&&(p[j]<=sqrt((double)i))); j++)
			if (i%p[j]==0)
			{
				flag=false;
				break;
			}
		if (flag)
			p[pl++]=i;
	}
}

void Getpy(long x, int &l, int n[MAX], int s[MAX])
{
	int i;
	l=0;
	int t=x;
	for (i=0; ((i<pl)&&(p[i]<=x)); i++)
		if (t%p[i]==0)
		{
			n[l]=p[i];
			s[l]=0;
			do
			{
				s[l]++;
				t/=p[i];
			} while (t%p[i]==0);
			l++;
		}
}

void Input()
{
	int i;
	fin>>n>>m1>>m2;
	Getp();
	Getpy(m1,pnl,pn,pns);
	for (i=0; i<pnl; pns[i++]*=m2);
}

bool Pd(int &l, int n[MAX], int s[MAX])
{
	bool flag=false;
	int i,j=0;
	for (i=0; i<pnl; i++)
	{
		for (; ((j<l)&&(n[j]<pn[i])); j++);
		if ((s[j]<pns[i])||(j>=l)||(n[j]!=pn[i]))
		{
			if ((!flag)&&(s[j]==0))
				l=0;
			return false;
		}
		else
			flag=true;
	}
	return true;
}

void Search()
{
	int i,j;
	long s;
	int snl;
	int sn[MAX];
	int sns[MAX];
	int t;
	for (i=0; i<n; i++)
	{
		fin>>s;
		Getpy(s,snl,sn,sns);
		t=1;
		while (!Pd(snl,sn,sns))
		{
			if (snl==0)
			{
				t=MAX;
				break;
			}
			t++;
			for (j=0; j<snl; sns[j++]*=2);
		}
		if (t<ans)
			ans=t;
	}
	fin.close();
}

void Output()
{
	ofstream fout(O_F);
	if (ans==MAX)
		fout<<"-1\n";
	else
		fout<<ans<<'\n';
	fout.close();
}