标签:code int pre ace 其他 pac test using 数字
https://codeforces.com/contest/1174/problem/C
题意:给定一个数字n,构造出一个数组,在这个数组下标[2,n]的区间内,每个元素对(ai,aj)如果i和j是互质数,那么ai != aj 并且数组的最大值要尽量小
思路:2个不相同的质数之间必然是互质数,2个合数如果没有共同的质因数那么也是互质数。
那么对于数字n,构造出的数组的最大值 m>=p ,p为区间[2,n]的质数个数。我们给每个质数下标分配一个独特的值,并让其他所有合数下标等于它们各自其中任意一个质因数下标的值,因为2个合数之间如果是互质的,那么一定它们之间没有质因数,它们2个的值也不可能相等。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2e5+5;
const int INF=0x3f3f3f3f;
// n=10:
// 1 2 1 3 1 4 1 2 1
int a[maxn];
int main(){
//freopen("datain.txt", "r", stdin);
ios::sync_with_stdio(0);
cin.tie(0);
int n;cin>>n;
int cnt=0;
memset(a,0x3f,sizeof a);
for(int i=2;i<=n;i++){
if(a[i]==INF) {
cnt++;
a[i]=cnt;
for(int j=2*i;j<=n;j+=i)
a[j]=min(a[j],cnt);
}
}
for(int i=2;i<=n;i++)
cout<<a[i]<<‘ ‘;
cout<<endl;
}
CF1174C Special Coloring Problem 数论(质因数性质),构造算法
标签:code int pre ace 其他 pac test using 数字
原文地址:https://www.cnblogs.com/hanker99/p/10972626.html