列表

详情


NC25534. 粉丝群

描述

在wjyyy粉丝群中,除了wjy一共有n个人,编号为1到n。

大家准备一起膜爆wjy,也就是说复读2n次消息,并且由于这n个人在膜wjy上是统一的,所以每个人都必须至少复读一次。

wjy想要禁言掉一些人,但是这里是wjy粉丝群,不能随便禁言膜wjy的人,于是wjy定下一个规则:

> 如果这n个人,能够分成两组,使得两个组中所有人的复读次数的加和是相同的,那么这n个人都要被禁言。

这n个人开始讨论,他们不想被暴政。

那么问题来了,有多少种复读的分配方法,使得wjyyy没法把这n个人分成满足以上条件的两组?

然而wjy的粉丝太多了,您只要输出分配方法的种数以及这些分配方法中字典序第k小的分配方式的异或和即可。

注意:如果有两个人,则复读次数分别为(1,3)与复读次数分别为(3,1) 算两种不同的分配方式。

输入描述

输入一行,两个正整数表示和k。

同时保证字典序第k小的方案一定存在。

输出描述

输出两行,第一行是满足条件的方式的个数,第二行是第k个满足条件的方式的xor和。

示例1

输入:

3 2

输出:

4
4

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

Python3(3.5.2) 解法, 执行用时: 40ms, 内存消耗: 3392K, 提交时间: 2020-01-16 18:42:24

n, m = map(int, input().split())
if n == 1 :
    print(1)
    print(2)
else :
    if (n & 1) == 1 :
        print(n + 1)
        if (m == n) :
            print(2)
        else :
            print(n + 1)
    else :
        print(n)
        print(n)

C++14(g++5.4) 解法, 执行用时: 4ms, 内存消耗: 612K, 提交时间: 2019-09-17 14:30:05

#include<bits/stdc++.h>
using namespace std;
long long n,k;
int main()
{
	cin>>n>>k;
	if (n==1){	return printf("1\n2\n")==0;}
	if (n&1)	return printf("%lld\n%lld\n",n+1,(k==n)?2:n+1)==0;
	printf("%lld\n%lld\n",n,(n+1)^1);
}

C++11(clang++ 3.9) 解法, 执行用时: 4ms, 内存消耗: 480K, 提交时间: 2019-09-15 11:30:35

#include <cstdio>
 
long long n, k;
 
int main() {
    scanf("%lld %lld", &n, &k);
    printf("%lld\n%lld", n + (n & 1) - (n == 1), k == n && n & 1 ? 2 : n & 1 ? n + 1 : n);
}

上一题