社区讨论
快挂了,才50
P1621集合参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mi4esbia
- 此快照首次捕获于
- 2025/11/18 18:06 4 个月前
- 此快照最后确认于
- 2025/11/18 18:06 4 个月前
CPP
#include<iostream>
#include<cstdio>
#include<queue>
#include<vector>
#include<algorithm>
#include <cmath>
#define maxa 100009
using namespace std;
int set[maxa],pml[maxa],pn,A,B,P;
bool pm[maxa];
int Min(int a,int b){return a<b? a:b;}
void mkpm(int size){
pn=0;
for(int i=0;i<=size;i++) pm[i]=1;
//
for(int i=2;i<=size;i++){
if(pm[i]==0) continue;
for(int j=2;j<=sqrt(i);j++)
if(i%j==0){
pm[i]=0;
for(int k=i;k<=size;k+=i)
pm[k]=0;
break;
}
}
for(int i=2;i<=size+2;i++)
if(pm[i]) pml[pn++]=i;
}
int facnum(int T,int a[]){
for(int i=0;i<=T;i++) a[i]=0;
//
int prime,mk,maxpm=0;
for(int i=0;i<pn;i++){
prime=pml[i];
mk=0;
//
while(T%prime==0){
T/=prime;
a[prime]++;
mk=1;
}
if(mk) maxpm=prime;
}
return maxpm;
}
int fa(int x){
if(set[x]==x) return x;
set[x]=fa(set[x]);
return set[x];
}
void un(int x,int y){
if(x==13 || y==13)
x=13;
int fx,fy;
fx=fa(x);
fy=fa(y);
if(fx!=fy){
set[fx]=fy;
}
}
int main(){
scanf("%d%d%d",&A,&B,&P);
//
for(int i=A;i<=B+5;i++) set[i]=i;
int maxpma,maxpmb,a[maxa],b[maxa];
//
mkpm(B);
for(int i=A;i<=B;i++){
maxpma=facnum(i,a);
for(int j=i+1;j<=B;j++){
maxpmb=facnum(j,b);
if(j==13){
j=13;
}
for(int k=2;k<=Min(maxpma,maxpmb);k++){
if(pm[k] && a[k]!=0 && b[k]!=0 && k>=P){
un(i,j);
break;
}
}
}
}
//
int ans=0;
for(int i=A;i<=B;i++){
//fa(i);
if(set[i]==i) ans++;
}
printf("%d\n",ans);
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...