CF1174C Special Coloring Problem 数论(质因数性质),构造算法

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值