列表

详情


NC54300. 罗德岛裁员

描述

罗德岛经历了史上最大的经济危机!

贸易站迟迟不进货,博士失去了理智,罗德岛现在的龙门币储备为0

凯尔希咬了咬牙,决定对罗德岛进行裁员.

裁员规则是这样的:

 首先有 n 位干员按照编号从小到大顺时针坐成一圈  第一轮,一号干员顺时针方向的下一个干员被裁;  接下来的每一轮,出局干员顺时针方向的未出局的第二位干员被裁  裁员总共进行 n-1 轮,最后剩下的干员被留下

凯尔希已经知道,罗德岛干员的总共数量,又从阿米娅那里得知了剩下的干员的编号。凯尔希越想越不对劲,因为在这种规则下,如果有些人没有参加裁员,也能得到这个结果。

现在凯尔希想知道,在干员人数 的最大值 和 留下的干员的编号已知的情况下,有多少种可能的参与裁员的干员数,以及可能的最大的参与人数是多少

输入描述

第一行两个整数 n 和 m ,表示参与裁员的最大人数 以及留下的干员的编号

输出描述

两个整数,表示可能的情况数 以及 最大可能的参与人数,如方案数为零则输出 '0 0'(不含引号)

示例1

输入:

9 3

输出:

3 9

说明:

在最大人数为 9 的限制下,共有三种情况满足最终留下的干员编号为 3 :

1. n=3,出局情况为 2\rightarrow1


2. n=5,出局情况为 2\rightarrow4\rightarrow1\rightarrow5


3. n=9,出局情况为 2\rightarrow4\rightarrow6\rightarrow8\rightarrow1\rightarrow5\rightarrow9\rightarrow7


并且易知这里的最大的满足条件的为 9

原站题解

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

C++14(g++5.4) 解法, 执行用时: 4ms, 内存消耗: 504K, 提交时间: 2019-12-01 00:45:51

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int x,cnt = 0,res,m,n;
	cin>>n>>m;
	x = (m - 1)/2 ,res = 1;
	if(m%2==0)
	{
		puts("0 0");
		return 0;
	}
	while(1)
	{
		if(x + res<=n&&res>x)++cnt;
		if(x + res>n)break;
		res*=2;
	}
	printf("%d %d\n",cnt,res/2 + x);
	return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 5ms, 内存消耗: 508K, 提交时间: 2019-11-23 21:36:10

#include<bits/stdc++.h>
using namespace std;
int n,m,k,ans1,ans2;
int main(){
    scanf("%d%d",&n,&m);if(!(m&1))puts("0 0"),exit(0);
    k=(m-1)>>1;
    for(long long i=1;i+k<=n;i<<=1){
        if(k>=i)continue;
        ans1++;ans2=i+k;
    }
    printf("%d %d\n",ans1,ans2);
}

上一题