洛谷 P10835 『FLA - I』冲云霄 题解

题目传送门
洛谷题解

题意概要

给出两个整数 n , m n,m n,m,判断是否存在一个长度为 m m m 的序列 a a a,满足以下条件。

  • 数列中的元素为正整数

  • a 1 ⊕ a 2 ⊕ ⋯ ⊕ a m = n a_1 \oplus a_2 \oplus \dots \oplus a_m=n a1a2am=n
    即序列 a a a 的所有项异或得到的结果等于 n n n

  • 数列 a a a 中所有元素的值都相同。

思路讲解

仔细观察,不难发现 x ⊕ x = 0 ( x ∈ N ) x \oplus x=0(x \in \N) xx=0(xN),且 0 ⊕ x = x ( x ∈ N ) 0 \oplus x=x(x \in \N) 0x=x(xN)。根据这两条公式,可得出以下结论。

m m m 为奇数时, a 1 ⊕ a 2 ⊕ ⋯ ⊕ a m = a m ( m   m o d   2 = 1 ) a_1 \oplus a_2 \oplus \dots \oplus a_m=a_m(m \bmod 2=1) a1a2am=am(mmod2=1)。因为可以将序列 a a a 中的所有除了 a m a_m am 以外的元素两两异或为 0 0 0(因为序列 a a a 中的元素都相同,所以根据前面的公式,两两异或后的结果为 0 0 0),结果最后就等于 0 ⊕ a m 0 \oplus a_m 0am 也就是 a m a_m am

m m m 为偶数时, a 1 ⊕ a 2 ⊕ ⋯ ⊕ a m = 0 ( m   m o d   2 = 0 ) a_1 \oplus a_2 \oplus \dots \oplus a_m=0(m \bmod 2=0) a1a2am=0(mmod2=0)。与上面同理,将序列中的元素两两异或为 0 0 0,最终结果为 0 0 0

根据上面得出的结论,分类讨论。

n = 0 n=0 n=0 时,只有当 m m m 为偶数时,才存在满足条件的序列 a a a,因为当 m m m 为偶数时, a 1 ⊕ a 2 ⊕ ⋯ ⊕ a m = 0 a_1 \oplus a_2 \oplus \dots \oplus a_m=0 a1a2am=0。否则当 m m m 为奇数时,因为序列 a a a 中的元素都为正整数,所以根据上面得出的公式( a 1 ⊕ a 2 ⊕ ⋯ ⊕ a m = a m ( m   m o d   2 = 1 ) a_1 \oplus a_2 \oplus \dots \oplus a_m=a_m(m \bmod 2=1) a1a2am=am(mmod2=1)), a 1 ⊕ a 2 ⊕ ⋯ ⊕ a m a_1 \oplus a_2 \oplus \dots \oplus a_m a1a2am 的结果肯定也为一个正整数。

n > 0 n>0 n>0 时,只有当 m m m 为奇数时,才存在满足条件的序列,因为当 m m m 为奇数时, a 1 ⊕ a 2 ⊕ ⋯ ⊕ a m = a m ( m   m o d   2 = 1 ) a_1 \oplus a_2 \oplus \dots \oplus a_m=a_m(m \bmod 2=1) a1a2am=am(mmod2=1),当序列 a a a 中的元素为 n n n 既可。否则当 m m m 为偶数时,根据上面得出的公式, a 1 ⊕ a 2 ⊕ ⋯ ⊕ a m = 0 ( m   m o d   2 = 0 ) a_1 \oplus a_2 \oplus \dots \oplus a_m=0(m \bmod 2=0) a1a2am=0(mmod2=0)。不管序列 a a a 的元素是多少,只要是正整数,结果一定会是 0 0 0 。不可能存在结果大于 0 0 0 的情况。

代码实现

#include <bits/stdc++.h>
using namespace std;
int main(){
   int n,m,t;
   cin>>t;
   while(t--){
       cin>>n>>m;
       if(n==0 && m%2==0)cout<<"Yes";
       else if(n==0 && m%2==1)cout<<"No";
       //当n等于0且m为偶数,则存在a数列
       else if(n && m%2==1)cout<<"Yes";
       else cout<<"No";
       //否则当n大于0且m为奇数,则存在a数列
       cout<<endl;
   } 
   return 0;
}

完结撒花!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值