CF1174C Ehab and a Special Coloring Problem(数论)

做法

(x)互质的数填不同的数,把有向关系表示出来,发现边数是不能承受的

反过来想,成倍数关系填相同的数,把这些数想象成一条链,而这条链开始的数一定是质数,(sumlimits_{prime_i}frac{n}{prime_i})是可以承受的

把这条链的点赋一个相同的值

Code

#include<bits/stdc++.h>
using namespace std;
typedef int LL;
const LL maxn=1e6+9;
inline LL Read(){
    LL x(0),f(1); char c=getchar();
    while(c<'0' || c>'9'){
        if(c=='-') f=-1; c=getchar();
    }
    while(c>='0' && c<='9'){
        x=(x<<3)+(x<<1)+c-'0'; c=getchar();
    }return x*f;
}
LL n,ans,tot;
LL visit[maxn],prime[maxn],phi[maxn],a[maxn];
int main(){
	n=Read();
	phi[1]=1;
	for(LL i=2;i<=n;++i){
		if(!visit[i]){
			prime[++tot]=i;
			phi[i]=i-1;
		}
		for(LL j=1;prime[j]*i<=n;++j){
			visit[prime[j]*i]=true;
			if(i%prime[j]==0){
				phi[prime[j]*i]=phi[i]*prime[j];
				break;
			}else
			    phi[prime[j]*i]=phi[i]*phi[prime[j]];
		}
	}
	for(LL i=1;i<=tot;++i){
		LL now(prime[i]);
		a[now]=i;
		LL val(now<<1);
		while(val<=n){
			a[val]=i;
			val+=now;
		}
	}
	for(LL i=2;i<=n;++i) printf("%d ",a[i]);
	return 0;
}
原文地址:https://www.cnblogs.com/y2823774827y/p/10973538.html