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; }
原文地址:https://www.cnblogs.com/hanker99/p/10972626.html
时间: 2024-10-07 08:24:25