51nod 吃葡萄-

在房间中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;
}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值