比赛 20101101 评测结果 AAAAAAAAWW
题目名称 整数合并 最终得分 80
用户昵称 Eme丶 运行时间 0.017 s
代码语言 C++ 内存使用 3.86 MiB
提交时间 2012-11-05 09:39:59
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#define N 100010
using namespace std;

int tot,l,r,p;
int f[N],a[N],g[N];

void Init()
{
	scanf("%d%d%d",&l,&r,&p);
	a[0]=0;
	for (int i=p;i<=1000;i++)
	{
		bool b=true;
		for (int j=2;j<=i-1;j++)
			if (i % j==0)
			{
				b=false;
				break;
			}
		if (b) a[++a[0]]=i;
	}
}

int Get(int x)
{
	if (x==f[x]) return x;
	f[x]=Get(f[x]);
	return f[x];
}

void Union(int x,int y)
{
	int fx=Get(x);
	int fy=Get(y);
	if (fx!=fy)
	{
		f[fx]=fy;
		g[fy]+=g[fx];
		tot--;
	}
}

void Main()
{
	for (int i=1;i<=r;i++) f[i]=i;
	for (int i=1;i<=r;i++) g[i]=1;
	tot=r-l+1;
	for (int i=1;i<=a[0];i++)
	{
		int lb=(l/a[i]);
		if (l % a[i]!=0) lb++;
		int rb=(r/a[i])-1;
		for (int j=lb;j<=rb;j++) Union(a[i]*j,a[i]*(j+1));
	}
	printf("%d\n",tot);
}

int main()
{
	freopen("setb.in","r",stdin);
	freopen("setb.out","w",stdout);
	
	Init();
	Main();
		
	fclose(stdin); fclose(stdout);
	return 0;
}