南邮 OJ 1069 生日聚会

生日聚会

时间限制(普通/Java) :  20000 MS/ 3000 MS          运行内存限制 : 65536 KByte
总提交 : 118            测试通过 : 43 

比赛描述

       今天是JacmY生日,他请大家吃饭,就这样,一行N个人来到了餐馆,大家吃吃喝喝,有说有笑,气氛甚欢,这时突然有人提议大家玩一个游戏,听罢规则后,就开始了游戏。

    游戏规则是这样的,吃饭的N个人围坐在桌子旁,JacmY是1号,沿着顺时针方向开始编号,2、3……N,然后由JacmY随机说一个数K(1 <= K <= N),从JacmY开始顺时针报数,“1,2……”,当有人报到K时,这个人从他的位置起来,先坐到了其他桌子,然后由下一个人重新从1开始报……就这样循环下去,每当有人报到K,这个人就离开了桌子,直到剩下这最后一个人,他非常倒霉的要接受大家的惩罚,就是罚酒一杯。JacmY有些郁闷了,K是由自己说的,万一说不好让自己受惩罚了,这个就有点不爽了,所以JacmY想请你帮忙找出哪些K会让他受罚,这样以来,JacmY就不用担心会喝太多酒了!



输入

 第一行一个整数T代表样例的组数

下面T行,每行一个整数N, 1 <= N<= 100;N如题目所述。

输出

       对于每组数据,第一行输出一个整数M,表示有M个这样的K会让JacmY受罚,接下来一行是M个整数,代表K分别取的哪些值,这些数字间用空格隔开。

样例输入

3
5
8
10

样例输出

1
4
2
2 6
1
8

题目来源

Internet


#include<iostream>
using namespace std;


int main(){
	int T,N,K,n,m,i,k;
	bool away[101];
	int a[101];
	cin>>T;
	while(T--){
		m=0;
		cin>>N;
		for(K=2;K<=N;++K){		//K=1的话最后走的肯定不是自己
			memset(away,0,101);
			n = N;				//桌上剩余的人数
			i = 0;				
//			cout<<"K="<<K<<":   ";
			while(n>1){
				k = 0;
				while(k<K){		//k表示数的数,k=K时剔除
					do{
						if(++i>N)
							i=1;
					}while(away[i]);	//找到下个还坐在桌上的人
					++k;
				}
				away[i] = 1;		//走掉一个人
//				cout<<i<<"away ";
				if(i==1)
					break;
				--n;
			}
			if(!away[1]){
				a[m++] = K;
//				cout<<"         K="<<K<<"满足要求";
			}
//			cout<<endl;
		}
		if(m==0){
			cout<<0<<endl;
			continue;
		}
		cout<<m<<endl<<a[0];
		for(i=1;i<m;++i)
			cout<<" "<<a[i];
		cout<<endl;
	}
}





你可能感兴趣的:(ACM,南邮OJ,生日聚会)