题意
第一个人平分椰子,然后取一堆,正好剩下一个给猴子。以此类推。到第二天正好分给所有人,问人最多有几个。
思路
我们可以枚举n-1的因子,再逐一检查是否符合条件。
代码
#include <stack>
#include <cstdio>
#include <list>
#include <cassert>
#include <set>
#include <fstream>
#include <iostream>
#include <string>
#include <vector>
#include <queue>
#include <functional>
#include <cstring>
#include <algorithm>
#include <cctype>
//#pragma comment(linker, "/STACK:102400000,102400000")
#include <string>
#include <map>
#include <cmath>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/hash_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
#define LL long long
#define ULL unsigned long long
#define SZ(x) (int)x.size()
#define Lowbit(x) ((x) & (-x))
#define MP(a, b) make_pair(a, b)
#define MS(arr, num) memset(arr, num, sizeof(arr))
#define PB push_back
#define X first
#define Y second
#define ROP freopen("input.txt", "r", stdin);
#define MID(a, b) (a + ((b - a) >> 1))
#define LC rt << 1, l, mid
#define RC rt << 1|1, mid + 1, r
#define LRT rt << 1
#define RRT rt << 1|1
#define FOR(i, a, b) for (int i=(a); (i) < (b); (i)++)
#define FOOR(i, a, b) for (int i = (a); (i)<=(b); (i)++)
const double PI = acos(-1.0);
const int INF = 0x3f3f3f3f;
const double eps = 1e-8;
const int MAXN = 5e6+10;
const int MOD = 10000007;
const int dir[][2] = { {-1, 0}, {1, 0}, {0, -1}, {0, 1} };
const int seed = 131;
int cases = 0;
typedef pair<int, int> pii;
int num;
bool Check(int n)
{
int tmp = num;
FOR(i, 0, n)
{
if (tmp % n != 1) return false;
tmp--;
tmp -= tmp / n;
}
return tmp % n == 0;
}
vector<int> fac;
int Resolve(int n)
{
fac.clear();
fac.PB(n);
int m = sqrt(n+.5);
FOOR(i, 2, m)
{
if (n % i == 0)
{
fac.PB(i);
if (i*i != n) fac.PB(n/i);
}
}
sort(fac.begin(), fac.end(), greater<int>());
FOR(i, 0, SZ(fac))
{
int u = fac[i];
if (Check(u))
{
printf("%d people and 1 monkey\n", u);
return 1;
}
}
return -1;
}
int main()
{
//ROP;
while (scanf("%d", &num), num != -1)
{
printf("%d coconuts, ", num);
if (num == 1 || Resolve(num-1) < 0) puts("no solution");
}
return 0;
}