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

时间: 2024-10-07 08:24:25

CF1174C Special Coloring Problem 数论(质因数性质),构造算法的相关文章

Codeforces Round #563 (Div. 2)C. Ehab and a Special Coloring Problem

原文链接:传送门思路:素数筛代码: 1 #include"iostream" 2 #include"algorithm" 3 #include"cstring" 4 using namespace std; 5 long long a[2000006],n; 6 int main(){ 7 cin>>n; 8 long long flag = 1; 9 memset(a,0,sizeof(a)); 10 for(int i=2;i&l

HDU3988-Harry Potter and the Hide Story(数论-质因数分解)

Harry Potter and the Hide Story Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 2193    Accepted Submission(s): 530 Problem Description iSea is tired of writing the story of Harry Potter, so,

UVA 11490 - Just Another Problem(数论)

11490 - Just Another Problem 题目链接 题意:有S个士兵,排成一个矩阵,矩阵中可以有两个洞,要求两个洞上下左右厚度一样,问能缺少士兵的情况数. 思路:推推公式,设厚度为a, 正方形为i, 那么(3 a + 2 i) (2 a + i) = S + 2 i i; 化简一下得到6 i i + 7 a i = S 由于S很大,所以去枚举厚度,这样只要枚举到sqrt(S)就够了,复杂度可以接受 代码: #include <stdio.h> #include <stri

UVa1363 - Joseph&#39;s Problem(数论)

在题目中有三种情况: 1.1<k<n: 2.k == n ; 3.k>n; 对于第一种情况我们可以分为1到k和k到n两个子问题来解. 1.1.1到k: for( i = 1 , sum = 0 ; i <= k ; i ++ ) sum += k %i ; 1.2.k到n: sum =(n-k)*k; 而对于第二种情况就是第一种情况的(1).但是就这样写的话时明显的tle的. 对于第二种情况也可以分为几个小问题来求解: 2.1.1到k/2: for( i = k/2 ; i >

UVA 1363 - Joseph&#39;s Problem(数论)

UVA 1363 - Joseph's Problem 题目链接 题意:给定n, k,求出∑ni=1(k mod i) 思路:由于n和k都很大,直接暴力是行不通的,然后在纸上画了一些情况,就发现其实对于k/i相同的那些项是形成等差数列的,于是就可以把整个序列进行拆分成[k,k/2],[k/2, k/3], [k/3,k/4]...k[k/a, k/b]这样的等差数列,利用大步小步算法思想,这里a枚举到sqrt(k)就可以了,这样就还剩下[1,k/a]的序列需要去枚举,总时间复杂度为O(sqrt(

CF:Problem 427C - Checkposts强连通Tarjan算法

这题昨晚做了,刚开始看题的时候没想出好法子,然后就看D题了,一看D题发现是后缀数组,然后就把模板改了点就交了上去--不幸的是--WA了,然后重新看题,果然题目看漏了--不仅要用后缀数组和前缀数组求出公共子缀,还要是求最小的,而且在每个串里都不能重复的,这下就想了会不会了,然后看见大帝C过了,然后就重新回来看C了,看了会终于明天怎么做了. C题意:给个图,然后每个点都有权值,求最小的花费及方案数:最小的花费是这样的:因为是建立一个岗哨,然后这个岗哨可以管哪些呢,可以管 i = j 的,或者可以从

考研计算机基础:构造算法与自上而下逐步完善:实例研究2

构造算法与自上而下逐步完善:实例研究2(标记控制重复) 下面将全班平均成绩问题一般化,考虑如下问题: 开发一个计算全班平均成绩的程序,在每次程序运行时处理任意个成绩数. 在第一个全班平均成绩例子中,成绩个数(10)是事先预置的.而本例中,则不知道要输入多少个成绩,程序要处理任意个成绩数.程序怎么确定何时停止输入成绩呢?何时计算和打印全班平均成绩呢? 一种办法是用一个特殊值作为标记值(sentinelvalue),也称信号值(signalvalue).哑值(dummy value)或标志值(fla

CF:Problem 427C - Checkposts强连通 Tarjan算法

tarjan算法第一题 喷我一脸....把手写栈的类型开成了BOOL,一直在找错... #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define maxn 100005 const int MOD=1000000007; using namespace std; struct node { int to,next; }edge[maxn*3]; int

考研计算机基础构造算法的实例研究

构造算法:实例研究1(计数器控制重复) 要演示如何开发算法,我们要解决几个全班平均成绩的问题.考虑下列问题: 班里有10个学生参加测验,可以提供考试成绩(0到100的整数值),以确定全班平均成绩. 全班平均成绩等于全班成绩总和除以班里人数.计算机上解决这个问题的算法是辅人每人的成绩,进行平均计算,然后打印结果. 下面用伪代码列出要执行的操作,指定这些操作执行的顺序.我们用计数器控制重复(counter-conttrolled repetition)一次一个地输人每人的成绩.这种方法用计数器(co