比赛 20101101 评测结果 WAAWWWAWTT
题目名称 整数合并 最终得分 30
用户昵称 Truth.Cirno 运行时间 2.547 s
代码语言 C++ 内存使用 4.04 MiB
提交时间 2012-11-05 09:13:52
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <stack>
using namespace std;

int dad[100010],siz[100010],sunum=1,su[400]={2};
stack<int> sta;

bool checksu(int num)
{
	int i,temp=sqrt(num*1.0);
	for (i=0;su[i]<=temp&&i<sunum;i++)
		if (num%su[i]==0)
			return(0);
	return(1);
}

int findroot(int ys)
{
	while (dad[ys])
	{
		sta.push(ys);
		ys=dad[ys];
	}
	while (!sta.empty())
	{
		dad[sta.top()]=ys;
		sta.pop();
	}
	return(ys);
}

void combine(int a,int b)
{
	a=findroot(a);
	b=findroot(b);
	if (siz[a]>siz[b])
	{
		siz[a]+=siz[b];
		dad[b]=a;
	}
	else
	{
		siz[b]+=siz[a];
		dad[a]=b;
	}
}

bool check(int x,int y,int p)
{
	int i;
	for (i=0;su[i]<=x&&i<sunum;i++)
	{
		if (su[i]<p)
			continue;
		if (x%su[i]==0)
			if (y%su[i]==0)
				return(1);
	}
	return(0);
}

int main(void)
{
	freopen("setb.in","r",stdin);
	freopen("setb.out","w",stdout);
	int i,j,a,b,p,x,y,total,temp=sqrt(100000.0);
	for (i=3;i<=temp;i++)
		if (checksu(i))
			su[sunum++]=i;
	cin>>a>>b>>p;
	total=b-a+1;
	for (i=a;i<=b;i++)
		siz[i]=1;
	for (i=a;i<b;i++)
		for (j=i+1;j<=b;j++)
		{
			x=findroot(i);
			y=findroot(j);
			if (x!=y)
			{
				if (check(i,j,p))
				{
					combine(x,y);
					total--;
				}
			}
		}
	cout<<total<<endl;
	return(0);
}