40分求调 【玄关】
  • 板块P1621 集合
  • 楼主small_moon
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/8/15 16:34
  • 上次更新2024/8/15 18:39:00
查看原帖
40分求调 【玄关】
1115392
small_moon楼主2024/8/15 16:34
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
typedef long long ll;
ll read();
ll l,r,p;
ll f[N];
vector <ll> pri;
bool vis[N];
ll find(ll x)
{
	if(f[x]==x) return x;
	return f[x]=find(f[x]);
}
void init()
{
	for(ll i=2;i<=r;i++)
	{
		if(!vis[i]) pri.push_back(i);
		for(auto x:pri)
		{
			if(x*i>r) break;
			vis[x*i]=1;
			if(i%x) break;
		}
	}
}
int main()
{
	l=read(); r=read(); p=read();
	init();
	for(ll i=1;i<=r;i++) f[i]=i;
	for(auto x:pri)
	{
		if(x<p) continue;
		ll i=1;
		while(x*i<l) i++;
		for(ll j=i+1;x*j<=r;j++) f[find(x*i)]=find(x*j);
	}//思路:枚举大于p的质数,合并它们的倍数
	ll cnt=0;
	for(int i=l;i<=r;i++)
		if(f[i]==i) cnt++;
	printf("%lld",cnt);
	return 0;
}
ll read()
{
	ll x=0,f=1; char ch=getchar();
	while(ch<'0' || ch>'9')
	{
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(ch>='0' && ch<='9')
	{
		x=(x<<1)+(x<<3)+(ch^48);
		ch=getchar();
	}
	return x*f;
}
2024/8/15 16:34
加载中...