NC54300. 罗德岛裁员
描述
罗德岛经历了史上最大的经济危机!
贸易站迟迟不进货,博士失去了理智,罗德岛现在的龙门币储备为0!
凯尔希咬了咬牙,决定对罗德岛进行裁员.
裁员规则是这样的:
首先有 n 位干员按照编号从小到大顺时针坐成一圈 第一轮,一号干员顺时针方向的下一个干员被裁; 接下来的每一轮,出局干员顺时针方向的未出局的第二位干员被裁 裁员总共进行 n-1 轮,最后剩下的干员被留下
凯尔希已经知道,罗德岛干员的总共数量,又从阿米娅那里得知了剩下的干员的编号。凯尔希越想越不对劲,因为在这种规则下,如果有些人没有参加裁员,也能得到这个结果。
现在凯尔希想知道,在干员人数 的最大值 和 留下的干员的编号已知的情况下,有多少种可能的参与裁员的干员数,以及可能的最大的参与人数是多少
输入描述
第一行两个整数 n 和 m ,表示参与裁员的最大人数 以及留下的干员的编号
输出描述
两个整数,表示可能的情况数 以及 最大可能的参与人数,如方案数为零则输出 '0 0'(不含引号)
示例1
输入:
9 3
输出:
3 9
说明:
在最大人数为 9 的限制下,共有三种情况满足最终留下的干员编号为 3 :
1. n=3,出局情况为
2. n=5,出局情况为
3. n=9,出局情况为
并且易知这里的最大的满足条件的为 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); }