Codeforces Round #275 (Div. 2)

链接:http://codeforces.com/contest/483

A. Counterexample

time limit per test

1 second

memory limit per test

256 megabytes

Your friend has recently learned about coprime numbers. A pair of numbers
{a,?b} is called
coprime if the maximum number that divides both a and
b is equal to one.

Your friend often comes up with different statements. He has recently supposed that if the pair
(a,?b) is coprime and the pair
(b,?c) is coprime, then the pair
(a,?c) is coprime.

You want to find a counterexample for your friend‘s statement. Therefore, your task is to find three distinct numbers
(a,?b,?c), for which the statement is false, and the numbers meet the condition
l?≤?a?<?b?<?c?≤?r.

More specifically, you need to find three numbers
(a,?b,?c), such that
l?≤?a?<?b?<?c?≤?r, pairs
(a,?b) and (b,?c) are coprime, and pair
(a,?c) is not coprime.

Input

The single line contains two positive space-separated integers
l, r (1?≤?l?≤?r?≤?1018;
r?-?l?≤?50).

Output

Print three positive space-separated integers
a, b,
c — three distinct numbers (a,?b,?c) that form the counterexample. If there are several solutions, you are allowed to print any of them. The numbers must be printed in ascending order.

If the counterexample does not exist, print the single number -1.

Sample test(s)

Input

2 4

Output

2 3 4

Input

10 11

Output

-1

Input

900000000000000009 900000000000000029

Output

900000000000000009 900000000000000010 900000000000000021

Note

In the first sample pair (2,?4) is not coprime and pairs
(2,?3) and (3,?4) are.

In the second sample you cannot form a group of three distinct integers, so the answer is -1.

In the third sample it is easy to see that numbers
900000000000000009 and 900000000000000021 are divisible by three.

简单构造:第一个数和第二个数互素,第二个数和第三个数互素,第一个数和第三个数不互素,显然找偶奇偶序列

#include <cstdio>
#define ll long long
ll gcd(ll a, ll b)
{
    return b ? gcd(b, a % b) : a;
}
int main()
{
    ll a, b;
    ll ans[3] = {0};
    scanf("%I64d %I64d", &a, &b);
    if(b == a + 1)
    {
        printf("-1\n");
        return 0;
    }
    if(a % 2 == 1)
    {
        ans[0] = a + 1;
        ans[1] = a + 2;
    }
    else
    {
        ans[0] = a;
        ans[1] = a + 1;
    }
    for(ll i = a + 2; i <= b; i++)
    {
        if(gcd(ans[1], i) == 1 && gcd(ans[0], i) != 1)
        {
            ans[2] = i;
            break;
        }
    }
    if(ans[2] == 0)
    {
        printf("-1\n");
        return 0;
    }
    printf("%I64d %I64d %I64d\n", ans[0], ans[1], ans[2]);
}

B. Friends and Presents

time limit per test

1 second

memory limit per test

256 megabytes

You have two friends. You want to present each of them several positive integers. You want to present
cnt1 numbers to the first friend and
cnt2 numbers to the second friend. Moreover, you want all presented numbers to be distinct, that also means that no number should be presented to both friends.

In addition, the first friend does not like the numbers that are divisible without remainder by prime number
x. The second one does not like the numbers that are divisible without remainder by prime number
y. Of course, you‘re not going to present your friends numbers they don‘t like.

Your task is to find such minimum number v, that you can form presents using numbers from a set
1,?2,?...,?v. Of course you may choose not to present some numbers at all.

A positive integer number greater than 1 is called
prime if it has no positive divisors other than 1 and itself.

Input

The only line contains four positive integers cnt1,
cnt2,
x, y (1?≤?cnt1,?cnt2?<?109;
cnt1?+?cnt2?≤?109;
2?≤?x?<?y?≤?3·104) — the numbers that are described in the statement. It is guaranteed that numbers
x, y are prime.

Output

Print a single integer — the answer to the problem.

Sample test(s)

Input

3 1 2 3

Output

5

Input

1 3 2 3

Output

4

Note

In the first sample you give the set of numbers {1,?3,?5} to the first friend and the set of numbers
{2} to the second friend. Note that if you give set
{1,?3,?5} to the first friend, then we cannot give any of the numbers
1, 3,
5 to the second friend.

In the second sample you give the set of numbers {3} to the first friend, and the set of numbers
{1,?2,?4} to the second friend. Thus, the answer to the problem is
4.

构造两个序列,第一个序列要有cnt1个数且其中不能有x的倍数,第二个序列要有cnt2个数且其中不能有y的倍数。要求求出这两个序列中的最大数的最小值。

如果答案是ans则ans+1也满足可以发现问题满足二分做法的条件,cnt1个数为num - num / x,及1到num中不包含x倍数的数的个数,同理

cnt2个数为num - num / y,还有一点要注意的是必须满足cnt1 + cnt2 <= num - num / (x * y)因为题目要求两个集合中的元素不同,又因为x,y必然互素,所以cnt1和cnt2的和必须小于1到num中不包含(x * y)倍数的数的个数,不然两个集合必然出现重复元素,然后二分num的值便可以得到最终答案。

#include <cstdio>
int cal(int a, int b)
{
    return a - a / b;
}
int main()
{
    int cnt1, cnt2, x, y;
    scanf("%d %d %d %d", &cnt1, &cnt2, &x, &y);
    int l = 1, r = 2e9;
    while(l < r)
    {
        int mid = l + (r - l) / 2;
        if(cnt1 <= cal(mid, x) && cnt2 <= cal(mid, y) && cnt1 + cnt2 <= cal(mid, x * y))
            r = mid;
        else
            l = mid + 1;
    }
    printf("%d\n", r);
}

C. Diverse Permutation

time limit per test

1 second

memory limit per test

256 megabytes

Permutation
p is an ordered set of integers
p1,???p2,???...,???pn, consisting of
n distinct positive integers not larger than
n. We‘ll denote as
n the length of permutation p1,???p2,???...,???pn.

Your task is to find such permutation
p of length n, that the group of numbers
|p1?-?p2|,?|p2?-?p3|,?...,?|pn?-?1?-?pn|
has exactly k distinct elements.

Input

The single line of the input contains two space-separated positive integers
n, k (1?≤?k?<?n?≤?105).

Output

Print n integers forming the permutation. If there are multiple answers, print any of them.

Sample test(s)

Input

3 2

Output

1 3 2

Input

3 1

Output

1 2 3

Input

5 2

Output

1 3 2 4 5

Note

By |x| we denote the absolute value of number
x.

一个包含n个数的数列,要求相邻两元素差的绝对值的数的个数为k,要求构造这样的数列。

简单的构造题,k--并变号判断即可

#include <cstdio>
#include <cstring>
int const MAX = 1e5 + 5;
int a[MAX];
int hash[MAX];
int main()
{
    int n, k;
    scanf("%d %d", &n, &k);
    memset(hash, 0, sizeof(hash));
    a[1] = 1;
    hash[a[1]] = 1;
    int cnt = 1;
    for(int i = 2; i <= n; i++)
    {
        cnt++;
        a[i] = a[i - 1] + k;
        hash[a[i]] = 1;
        if(k > 0)
            k--;
        else
            k++;
        k *= -1;
        if(k == 0)
            break;
    }
    for(int i = 1; i <= n; i++)
        if(!hash[i])
            a[++cnt] = i;
    for(int i = 1; i < n; i++)
        printf("%d ", a[i]);
    printf("%d\n", a[n]);

}

D. Interesting Array

time limit per test

1 second

memory limit per test

256 megabytes

We‘ll call an array of n non-negative integers
a[1],?a[2],?...,?a[n]
interesting, if it meets
m constraints. The i-th of the
m constraints consists of three integers
li,
ri,
qi (1?≤?li?≤?ri?≤?n) meaning that value
should be equal to
qi.

Your task is to find any interesting array of
n elements or state that such array doesn‘t exist.

Expression x&y means the bitwise AND of numbers
x and y. In programming languages C++, Java and Python this operation is represented as "&", in Pascal — as "and".

Input

The first line contains two integers n,
m (1?≤?n?≤?105,
1?≤?m?≤?105) — the number of elements in the array and the number of limits.

Each of the next m lines contains three integers
li,
ri,
qi (1?≤?li?≤?ri?≤?n,
0?≤?qi?<?230) describing the
i-th limit.

Output

If the interesting array exists, in the first line print "YES" (without the quotes) and in the second line print
n integers a[1],?a[2],?...,?a[n] (0?≤?a[i]?<?230) decribing the
interesting array. If there are multiple answers, print any of them.

If the interesting array doesn‘t exist, print "NO" (without the quotes) in the single line.

Sample test(s)

Input

3 1
1 3 3

Output

YES
3 3 3

Input

3 2
1 3 3
1 3 2

Output

NO

题意如题,还是构造数列,线段树维护+判断

#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
int const MAX = 110000;
struct Node
{
    int l, r;
    int val;
};
Node tree[10 * MAX];
Node a[MAX];
vector<int> ans;

void build(int step, int l, int r)
{
    tree[step].l = l;
    tree[step].r = r;
    tree[step].val = 0;
    if(l == r)
        return;
    int mid = (l + r) >> 1;
    build(step << 1, l, mid);
    build(((step << 1) + 1), mid+1, r);
}
void update(int step, int l, int r, int val)
{
    if(tree[step].l == l && tree[step].r == r)
    {
        tree[step].val |= val;
        return;
    }
    int mid = (tree[step].l + tree[step].r) >> 1;
    if(r <= mid)
        update(step << 1, l, r, val);
    else if(l > mid)
        update((step << 1) + 1, l, r, val);
    else
    {
        update(step << 1, l, mid, val);
        update((step << 1) + 1, mid+1, r, val);
    }
}
int query(int step, int l, int r)
{
    if(tree[step].l == l && tree[step].r == r)
        return tree[step].val;
    int mid = (tree[step].l + tree[step].r) >> 1;
    if(r <= mid)
        return query(step << 1, l, r);
    if(l > mid)
        return query((step << 1) + 1, l, r);
    else
        return query(step << 1, l, mid) & query((step << 1) + 1, mid+1, r);
}
void solve(int step)
{
    if(step != 1)
        tree[step].val |= tree[step >> 1].val;
    if(tree[step].l == tree[step].r)
    {
        ans.push_back(tree[step].val);
        return ;
    }
    solve(step << 1);
    solve((step << 1) + 1);
}
int main()
{
    int n, m;
    scanf("%d %d", &n, &m);
    build(1, 1, n);
    for(int i = 0; i < m; i++)
    {
        scanf("%d %d %d", &a[i].l, &a[i].r, &a[i].val);
        update(1, a[i].l, a[i].r, a[i].val);
    }
    bool flag = true;
    for(int i = 0; i < m; i++)
    {
        if(query(1, a[i].l, a[i].r) != a[i].val)
        {
            flag = false;
            break;
        }
    }
    solve(1);
    if(flag)
    {
        printf("YES\n");
        for(int i = 0; i < ans.size(); i++)
            printf("%d%c",ans[i], i == n ? '\n' : ' ');
        ans.clear();
        printf("\n");
    }
    else
        printf("NO\n");
}
时间: 2024-10-27 17:09:36

Codeforces Round #275 (Div. 2)的相关文章

Codeforces Round #275 (Div. 1)A. Diverse Permutation 构造

Codeforces Round #275 (Div. 1)A. Diverse Permutation Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/482/problem/A Description Permutation p is an ordered set of integers p1,   p2,   ...,   pn, consisting of n distinct posi

Codeforces Round #275 (Div. 2) C - Diverse Permutation (构造)

题目链接:Codeforces Round #275 (Div. 2) C - Diverse Permutation 题意:一串排列1~n.求一个序列其中相邻两项差的绝对值的个数(指绝对值不同的个数)为k个.求序列. 思路:1~k+1.构造序列前段,之后直接输出剩下的数.前面的构造可以根据,两项差的绝对值为1~k构造. AC代码: #include <stdio.h> #include <string.h> int ans[200010]; bool vis[100010]; i

[Codeforces Round #275 (Div. 2)]B - Friends and Presents

最近一直在做 codeforces ,总觉得已经刷不动 BZOJ 了? ——真是弱喵 你看连 Div.2 的 B 题都要谢谢题解,不是闲就是傻 显然我没那么闲 ╮(╯_╰)╭ 我觉得这题的想法挺妙的~ 大意是你需要分别给 a 和 b cnt1 和 cnt2 个数字 但是 a 不要被 x 整除的数 ,as well as,b 不要被 y 整除的数 然后求需要给的最大数的最小值—— 最值的最值?那不是典型的二分吗? 但是——坑爹的英文题导致我完全没有意识到这一点…… 二分答案 v ,因为 a 不要被

Codeforces Round #275 (Div.1) Solution

好久没做题了,开场Virtual热热身. A 构造,我的方法是,取1,2,3...,k这几个差值,前k+1个数分别是 1, k+1, 2, k, ...., 之后就k+2, k+3, ..., n B 因为题设是与操作.我们按照每一位来,如果有一个限制某位是1,则将那段区间标志1,没有限制的位全部置零即可,然后检验为0的位是否全是1.标志一段区间可以用标记法,检验可以求和看差值. C 我做完之后看了CF tutorial 跟我的做法不同.我的做法比他给的复杂度低一点,不过题解好帅,而且跑出来速度

Codeforces Round #275 (Div. 2) A

题目传送门:http://codeforces.com/contest/483/problem/A 题意分析:在l到r的范围内找三个数,a,b,c . a和b互质,b和c互质,但a和c不是互质. 因为r-l<=50.所以直接暴力枚举三个数就行了. 代码: #include <cstdio> #include <algorithm> #include <cstring> #include <cmath> #include <iostream>

Codeforces Round #275 (Div. 2) B

题目传送门:http://codeforces.com/contest/483/problem/B 题意分析:在1-v的范围内找到一些数分为两个集合,满足第一个集合的元素不能被x整除且个数为cnt1, 第二个集合的元素不能被y整除且个数为cnt2,求最小的v: 二分答案,然后用只满足整除x,只满足整除y和既可整除x又可整除y这三个元素的关系去check一下 代码: #include <cstdio> #include <algorithm> #include <cstring

Codeforces Round #275 (Div. 2) C

题目传送门:http://codeforces.com/contest/483/problem/C 题意分析:题目意思没啥好说的. 去搞排列列举必须TLE,那么就想到构造. 1,n,2,n-1,3,n-2这个样子.k/2就是需要交换的元素对数,还需要考虑一下k的奇偶去判断没交换的元素是顺序输出还是逆序输出.自己尝试下几个数据就明白了. 代码: #include <cstdio> #include <algorithm> #include <cstring> #inclu

Codeforces Round #275 (Div. 2) D

题意 : 一个数组 给出m个限制条件 l r z 代表从l 一直 & 到 r 为 z  问能否构造出这种数组 如果可以 构造出来 因为 n m 都是1e5 而l r 可能输入进去就超时了 所以刚写完线段树课件的我想了很久想出来了线段树解法 ... 想法是这样的 每次输入 update 结束后 全部query一遍 看看是否和期望一样 一开始的想法是 存下每个数组的&值 一开始是1<<31 - 1 然后每次进行update 都求出这个区间在树上区间没有被更新到的点的& 三者

Codeforces Round #275 (Div. 1)

A 题意:给一个N和一个K,求一个1到N的排列,使得abs(a1-a2),abs(a2-a3)...abs(an-1-an)为k个不同的值. 题解:易知我们最大可以凑出N-1个不同的值只要这样1,N,2,N-1,3,....即可 所以我们还按照这个方式来,到凑出来k-1个数之后,把剩下的数从小到大输出即可,这样第k个值为1. #include <cstdio> #include <cmath> #include <iostream> #include <cstri