首页 > 其他分享 >P9033题解

P9033题解

时间:2023-02-10 22:46:14浏览次数:55  
标签:P9033 write le int 题解 void writeln

P9033「KDOI-04」XOR Sum 题解

题目链接

传送门

题意简述

构造一个长度为 \(n\),值域为 \([0,m]\) 的异或和为 \(k\) 的序列,如果不存在则输出 \(-1\)。

题目分析

首先很容易想到,当 \(k \le m\) 的时候,我们仅需要输出一个 \(k\) 剩下的位置全部填 \(0\) 即可。

而当 \(k > m\) 时,我们至少需要两个数,因此在此时判断 \(n\) 是否等于 \(1\),若不等于 \(1\),根据异或不进位原理,我们还需判断 \(k\) 和 \(m\) 的二进制位数关系。设 \(l_k,l_m\) 分别为 \(k,m\) 的二进制位数。

  • 若 \(l_m \le l_k\) 则无解。
  • 反之,我们可以让一个数是 \(2^{l_k}\),此时再构造出 \(k - 2^{l_k}\) 即可,可以证明 \(k - 2^{l_k} \le m\) 因此只需两个数 \(2^{l_k},k-2^{l_k}\) 即可,剩余部位补零。

Codes

//author: yuhang-ren
#include <bits/stdc++.h>
using namespace std;
void read(int &p)
{
    p = 0;
    int k = 1;
    char c = getchar();
    while (c < '0' || c > '9')
    {
        if (c == '-')
        {
            k = -1;
        }
        c = getchar();
    }
    while (c >= '0' && c <= '9')
    {
        p = p * 10 + c - '0';
        c = getchar();
    }
    p *= k;
    return;
}
void write_(int x)
{
    if(x < 0)
    {
        putchar('-');
        x = -x;
    }
    if(x>9)
    {
        write_(x/10);
    }
    putchar(x%10+'0');
}
void writesp(int x)
{
    write_(x);
    putchar(' ');
}
void writeln(int x)
{
    write_(x);
    putchar('\n');
}
int T,n,m,k;
signed main()
{
    #if _clang_
        freopen("1.in","r",stdin);
        freopen("1.out","w",stdout);
    #endif 
    read(T);
    for(int t = 1;t<=T;t++)
    {
        read(n),read(k),read(m);
        if(k <= m)
        {
            writesp(k);
            for(int i = 2;i<=n;i++)
            {
                writesp(0);
            }
            puts("");
            continue;
        }
        else
        {
            int l_k = 0,l_m = 0;
            int k_ = k;//k后面还需要用到,所以用k_代替k进行运算。
            for(;k_;k_>>=1)
            {
                l_k++;
            }
            for(;m;m>>=1)
            {
                l_m++;
            }
            if(n == 1)
            {
                writeln(-1);
                continue;
            }
            if(l_k > l_m)
            {
                writeln(-1);
                continue;
            }
            writesp((1<<(l_k-1)));
            writesp((k - (1<<(l_k-1))));
            for(int i = 3;i<=n;i++)
            {
                writesp(0);
            }
            puts("");
        }
    }
    return 0;
}

标签:P9033,write,le,int,题解,void,writeln
From: https://www.cnblogs.com/yuhang-ren/p/17103996.html

相关文章

  • CF1268B题解
    CF1268B题解题目翻译给你一个杨表,用一个有\(n\)个元素的数组\(a\)表示杨表每一列的高度。你需要用\(1\times2\)或\(2\times1\)的骨牌填充这个杨表,求出最多......
  • 题解:[PA2021] Drzewo czerwono-czarne
    题目链接:[PA2021]Drzewoczerwono-czarne首先对于起始和终止相同以及起始中只有一种颜色并且终止和起始不相同这两种情况是平凡的。考虑最后一步,一定是将某一条边上的一......
  • CF1296D 题解
    题目传送门简单题做了好久,哈哈。题目分析首先,对于单个怪物,先将它的血量通过取余处理到小于\(a+b\)的时候,因为无论怪物血量多少,如果大于\(a+b\),显然不可能出现最后一......
  • 关于node-sass和sass-loader版本不兼容的问题解决
    安装node-sass和sass-loader时,提示我版本不兼容如:ValidationError:Invalidoptionsobject.SassLoaderhasbeeninitializedusinganoptionsobjectth......尝试......
  • 问题解决:WARNING!The remote SSH server rejected X11 forwarding request.
    截图解决X11forwarding依赖xorg-x11-xauth软件包,安装xorg-x11-xauth软件包。yuminstallxorg-x11-xauth-y安装后重新连接即可......
  • 【题解】P5278 算术天才⑨与等差数列
    有趣的乱搞做法和一个没想到的trick,一起记一下。思路线段树+哈希/trick.首先是乱搞做法。意识到可以像P3792由乃与大母神原型和偶像崇拜那个被疯狂hack的题......
  • Codeforces Round #851 (Div. 2) 题解
    CodeforcesRound#851(Div.2)题解A.OneandTwo取\(\log_2\),变成加号,前缀和枚举\(s[i]=\dfrac{s[n]}{2}\)。B.SumofTwoNumbers对于每一位,如果是偶数则平均......
  • 问题解决:由于找不到msvcr110.dll,无法继续执行代码
    报错解决下载地址:https://www.microsoft.com/zh-cn/download/details.aspx?id=30679......
  • CF1389E Calendar Ambiguity 题解
    可能更好的阅读体验题面传送门toluogu题目大意假设一年有\(m\)月,每个月有\(d\)天,每周有\(w\)天。保证一年的第一天一定是周一。求\((x,y)\),满足\(x<y\)并且......
  • 【题解】CF850F Rainbow Balls
    整体方向很常规,但是最后的处理比较仙,记一下。思路期望dp.首先意识到最终会变成同一种颜色,并且不同颜色的期望步数不同。考虑到\(n\leq2.5\times10^3\),考虑钦定最......