在房间中G颗葡萄,现在有n个人。这n个人依次进入房间吃葡萄。每个人进去的时候都做如下操作,把葡萄分成n等份,发现还多出一颗,然后吃掉这一颗以及n等份中的一份,然后走出房间。这n个人吃完之后,最后房间里面的葡萄刚好可以分成n等分。问n最大是多少?
收起
输入
多组测试数据。 第一行输入一个整数T(1<=T<=200),表示测试数据的数目。 接下来T行,每一行一个整数G(1<=G<= 4000)
输出
对于每一组数据,输出一个整数表示最大的人数,如果无解输出No Solution。
输入样例
样例输入1 2 25 30
输出样例
样例输出1 3 No Solution
啊哈,终于碰到了数据有问题的题目了,这个题中没有考虑到每个人吃0个的情况,比如说3会输出2,到第二次分配的时候就会出现把一个葡萄分成三份,还要剩下一个,那么就是每个人吃了0个,这是数据问题,本来写了好久没找出问题,后来把每个人吃的葡萄数固定大于等于1删掉就过去了- -,代码如下:
#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
int f[1000];
int main() {
int a,b,c,d,e=0,g,h=0;
cin>>a;
for(b=1;b<=a;++b)
cin>>f[b];
for(b=1;b<=a;++b)
{h=0;
for(c=2;c<=f[b]-1;++c)
{d=f[b];
for(g=1;g<=c;++g)
{
if(d%c!=1) break;
if(d%c==1) {d=d-(d/c)-1;e++;} //就是这,if里我写了个d/c>=1就怎么也过不了,后来买了组数据发现是可能有人吃了0个葡萄,,,删掉成这样就对了
}
if(e==c&&d%c==0) h=c;
e=0;
}
if(h!=0) cout<<h<<endl;
else cout<<"No Solution"<<endl;
}
return 0;
}