求出最大的k,使得(n,k)=1,那么每个人都可以接到球了。于是问题转化为求最大的k,1<=k<n/2,使得(n,k)=1。
  1. 若n是奇数,那么由(n,n-1)=1得(n,(n-1)/2)=1,即k=(n-1)/2;
  2. 若n是偶数,那么:
    (1) n/2-1是奇数,(n,n/2-1)=(n/2-1,2)=1,即k=n/2-1;
    (2) n/2-1是偶数,(n,n/2-2)=(n/2-2,4)=1,即k=n/2-2。
  Submit 1: AC。而且遇到了BUG,0ms0kb。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include <stdio.h>
using namespace std;
 
const int maxdigit=2000;
 
struct bignum
{
    int *data,*head,len;
    bignum() { head=data=new int[2000]; data[0]=len=0; }
    ~bignum() { delete[] head; }
    int operator [](int i) { return data[i]; }
    void fix0();
    void div2();
    void minus1();
    void read();
    void print();
};
 
void bignum::fix0()
{
    while (!*data)
    {
        len--; data++;
    }
}
 
void bignum::div2()
{
    for (int i=0,r=0;i<len;i++)
    {
        r=r*10+data[i];
        data[i]=r>>1;
        r=r&1;
    }
    fix0();
}
 
void bignum::minus1()
{
    for (int i=len-1,s=1;i>=0;i--)
    {
        data[i]-=s;
        if (data[i]>=0) break;
        else data[i]+=10;
    }
    fix0();
}
 
void bignum::read()
{
    for (char c='0';c>=48;)
    {
        scanf("%c",&c);
        if (c>=48) data[len++]=c-48;
    }
}
 
void bignum::print()
{
    for (int i=0;i<len;i++) printf("%d",data[i]);
    printf("\n");
}
 
int main()
{
    bignum n;
    n.read();
    if (n[n.len-1]&1) n.div2();
    else
    {
        n.div2(); n.minus1();
        if (!(n[n.len-1]&1)) n.minus1();
    }
    n.print();
}