Acdream Chinese Girls' Amusement

A - Chinese Girls' Amusement

Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others)

Problem Description

      You must have heard that the Chinese culture is quite different from that of Europe or Russia. So some Chinese habits seem quite unusual or even weird to us.
      So it is known that there is one popular game of Chinese girls. N girls stand forming a circle and throw a ball to each other. First girl holding a ball throws it to the K-th girl on her left (1 ≤ K ≤ N/2). That girl catches the ball and in turn throws it to the K-th girl on her left, and so on. So the ball is passed from one girl to another until it comes back to the first girl. If for example N = 7 and K = 3, the girls receive the ball in the following order: 1, 4, 7, 3, 6, 2, 5, 1.
 To make the game even more interesting the girls want to choose K as large as possible, but they want one condition to hold: each girl must own the ball during the game.

Input

Input contains one integer number N (3 ≤ N ≤ 102000) — the number of Chinese girls taking part in the game.

Output

Output the only number — K that they should choose.

Sample Input

7
6

Sample Output

3
1

Hint

Java is not prepared !
 
  1 /*
  2 * this code is made by 987690183
  3 * Problem: 1210
  4 * Verdict: Accepted
  5 * Submission Date: 2014-10-14 13:59:15
  6 * Time: 0MS
  7 * Memory: 1680KB
  8 */
  9 #include<iostream>
 10 #include<cstring>
 11 #include<iomanip>
 12 #include<algorithm>
 13 #include<cstdlib>
 14 #include<cstdio>
 15 using namespace std;
 16 
 17 #define MAXN 9999
 18 #define MAXSIZE 1000
 19 #define DLEN 4
 20 
 21 class BigNum
 22 {
 23 private:
 24     int a[MAXSIZE];    //可以控制大数的位数
 25     int len;       //大数长度
 26 public:
 27     BigNum(){ len = 1;memset(a,0,sizeof(a)); }   //构造函数
 28     BigNum(const int);       //将一个int类型的变量转化为大数
 29     BigNum(const char*);     //将一个字符串类型的变量转化为大数
 30     BigNum(const BigNum &);  //拷贝构造函数
 31     BigNum &operator=(const BigNum &);   //重载赋值运算符,大数之间进行赋值运算
 32 
 33     friend istream& operator>>(istream&,  BigNum&);   //重载输入运算符
 34     friend ostream& operator<<(ostream&,  BigNum&);   //重载输出运算符
 35 
 36     BigNum operator+(const BigNum &) const;   //重载加法运算符,两个大数之间的相加运算
 37     BigNum operator-(const BigNum &) const;   //重载减法运算符,两个大数之间的相减运算
 38     BigNum operator*(const BigNum &) const;   //重载乘法运算符,两个大数之间的相乘运算
 39     BigNum operator/(const int   &) const;    //重载除法运算符,大数对一个整数进行相除运算
 40 
 41     BigNum operator^(const int  &) const;    //大数的n次方运算
 42     int    operator%(const int  &) const;    //大数对一个int类型的变量进行取模运算
 43     bool   operator>(const BigNum & T)const;   //大数和另一个大数的大小比较
 44     bool   operator>(const int & t)const;      //大数和一个int类型的变量的大小比较
 45 
 46     void print();       //输出大数
 47 };
 48 BigNum::BigNum(const int b)     //将一个int类型的变量转化为大数
 49 {
 50     int c,d = b;
 51     len = 0;
 52     memset(a,0,sizeof(a));
 53     while(d > MAXN)
 54     {
 55         c = d - (d / (MAXN + 1)) * (MAXN + 1);
 56         d = d / (MAXN + 1);
 57         a[len++] = c;
 58     }
 59     a[len++] = d;
 60 }
 61 BigNum::BigNum(const char*s)     //将一个字符串类型的变量转化为大数
 62 {
 63     int t,k,index,l,i;
 64     memset(a,0,sizeof(a));
 65     l=strlen(s);
 66     len=l/DLEN;
 67     if(l%DLEN)
 68         len++;
 69     index=0;
 70     for(i=l-1;i>=0;i-=DLEN)
 71     {
 72         t=0;
 73         k=i-DLEN+1;
 74         if(k<0)
 75             k=0;
 76         for(int j=k;j<=i;j++)
 77             t=t*10+s[j]-'0';
 78         a[index++]=t;
 79     }
 80 }
 81 BigNum::BigNum(const BigNum & T) : len(T.len)  //拷贝构造函数
 82 {
 83     int i;
 84     memset(a,0,sizeof(a));
 85     for(i = 0 ; i < len ; i++)
 86         a[i] = T.a[i];
 87 }
 88 BigNum & BigNum::operator=(const BigNum & n)   //重载赋值运算符,大数之间进行赋值运算
 89 {
 90     int i;
 91     len = n.len;
 92     memset(a,0,sizeof(a));
 93     for(i = 0 ; i < len ; i++)
 94         a[i] = n.a[i];
 95     return *this;
 96 }
 97 istream& operator>>(istream & in,  BigNum & b)   //重载输入运算符
 98 {
 99     char ch[MAXSIZE*4];
100     int i = -1;
101     in>>ch;
102     int l=strlen(ch);
103     int count=0,sum=0;
104     for(i=l-1;i>=0;)
105     {
106         sum = 0;
107         int t=1;
108         for(int j=0;j<4&&i>=0;j++,i--,t*=10)
109         {
110             sum+=(ch[i]-'0')*t;
111         }
112         b.a[count]=sum;
113         count++;
114     }
115     b.len =count++;
116     return in;
117 
118 }
119 /*ostream& operator<<(ostream& out,  BigNum& b)   //重载输出运算符
120 {
121     int i;
122     cout << b.a[b.len - 1];
123     for(i = b.len - 2 ; i >= 0 ; i--)
124     {
125         cout.width(DLEN);
126         cout.fill('0');
127         cout << b.a[i];
128     }
129     return out;
130 }*/
131 
132 BigNum BigNum::operator+(const BigNum & T) const   //两个大数之间的相加运算
133 {
134     BigNum t(*this);
135     int i,big;      //位数
136     big = T.len > len ? T.len : len;
137     for(i = 0 ; i < big ; i++)
138     {
139         t.a[i] +=T.a[i];
140         if(t.a[i] > MAXN)
141         {
142             t.a[i + 1]++;
143             t.a[i] -=MAXN+1;
144         }
145     }
146     if(t.a[big] != 0)
147         t.len = big + 1;
148     else
149         t.len = big;
150     return t;
151 }
152 BigNum BigNum::operator-(const BigNum & T) const   //两个大数之间的相减运算
153 {
154     int i,j,big;
155     bool flag;
156     BigNum t1,t2;
157     if(*this>T)
158     {
159         t1=*this;
160         t2=T;
161         flag=0;
162     }
163     else
164     {
165         t1=T;
166         t2=*this;
167         flag=1;
168     }
169     big=t1.len;
170     for(i = 0 ; i < big ; i++)
171     {
172         if(t1.a[i] < t2.a[i])
173         {
174             j = i + 1;
175             while(t1.a[j] == 0)
176                 j++;
177             t1.a[j--]--;
178             while(j > i)
179                 t1.a[j--] += MAXN;
180             t1.a[i] += MAXN + 1 - t2.a[i];
181         }
182         else
183             t1.a[i] -= t2.a[i];
184     }
185     t1.len = big;
186     while(t1.a[len - 1] == 0 && t1.len > 1)
187     {
188         t1.len--;
189         big--;
190     }
191     if(flag)
192         t1.a[big-1]=0-t1.a[big-1];
193     return t1;
194 }
195 
196 BigNum BigNum::operator*(const BigNum & T) const   //两个大数之间的相乘运算
197 {
198     BigNum ret;
199     int i,j,up;
200     int temp,temp1;
201     for(i = 0 ; i < len ; i++)
202     {
203         up = 0;
204         for(j = 0 ; j < T.len ; j++)
205         {
206             temp = a[i] * T.a[j] + ret.a[i + j] + up;
207             if(temp > MAXN)
208             {
209                 temp1 = temp - temp / (MAXN + 1) * (MAXN + 1);
210                 up = temp / (MAXN + 1);
211                 ret.a[i + j] = temp1;
212             }
213             else
214             {
215                 up = 0;
216                 ret.a[i + j] = temp;
217             }
218         }
219         if(up != 0)
220             ret.a[i + j] = up;
221     }
222     ret.len = i + j;
223     while(ret.a[ret.len - 1] == 0 && ret.len > 1)
224         ret.len--;
225     return ret;
226 }
227 BigNum BigNum::operator/(const int & b) const   //大数对一个整数进行相除运算
228 {
229     BigNum ret;
230     int i,down = 0;
231     for(i = len - 1 ; i >= 0 ; i--)
232     {
233         ret.a[i] = (a[i] + down * (MAXN + 1)) / b;
234         down = a[i] + down * (MAXN + 1) - ret.a[i] * b;
235     }
236     ret.len = len;
237     while(ret.a[ret.len - 1] == 0 && ret.len > 1)
238         ret.len--;
239     return ret;
240 }
241 int BigNum::operator %(const int & b) const    //大数对一个int类型的变量进行取模运算
242 {
243     int i,d=0;
244     for (i = len-1; i>=0; i--)
245     {
246         d = ((d * (MAXN+1))% b + a[i])% b;
247     }
248     return d;
249 }
250 BigNum BigNum::operator^(const int & n) const    //大数的n次方运算
251 {
252     BigNum t,ret(1);
253     int i;
254     if(n<0)
255         exit(-1);
256     if(n==0)
257         return 1;
258     if(n==1)
259         return *this;
260     int m=n;
261     while(m>1)
262     {
263         t=*this;
264         for( i=1;i<<1<=m;i<<=1)
265         {
266             t=t*t;
267         }
268         m-=i;
269         ret=ret*t;
270         if(m==1)
271             ret=ret*(*this);
272     }
273     return ret;
274 }
275 bool BigNum::operator>(const BigNum & T) const   //大数和另一个大数的大小比较
276 {
277     int ln;
278     if(len > T.len)
279         return true;
280     else if(len == T.len)
281     {
282         ln = len - 1;
283         while(a[ln] == T.a[ln] && ln >= 0)
284             ln--;
285         if(ln >= 0 && a[ln] > T.a[ln])
286             return true;
287         else
288             return false;
289     }
290     else
291         return false;
292 }
293 bool BigNum::operator >(const int & t) const    //大数和一个int类型的变量的大小比较
294 {
295     BigNum b(t);
296     return *this>b;
297 }
298 
299 void BigNum::print()    //输出大数
300 {
301     int i;
302     //cout << a[len - 1];
303     printf("%d",a[len-1]);
304     for(i = len - 2 ; i >= 0 ; i--)
305     {
306         /*cout.width(DLEN);
307         cout.fill('0');
308         cout << a[i];*/
309         printf("%04d",a[i]);
310     }
311     //cout << endl;
312     printf("
");
313 }
314 int main()
315 {
316     char zero[100]={"0"};
317     char one[100]={"1"};
318     char two[100]={"2"};
319     char hxl[2022];
320     BigNum z,ZERO(zero),ONE(one),TWO(two);
321     while(gets(hxl)>0)
322     {
323         BigNum x(hxl);
324         z=x%2;
325         if(z>0)/**奇数**/
326         {
327             z=(x-ONE)/2;
328         }
329         else /**偶数**/
330         {
331             x=x/2;
332             z=x%2;
333             if(z>0)/**奇数**/
334             {
335                 z=x-TWO;
336             }
337             else /**偶数**/
338             {
339                 z=x-ONE;
340             }
341         }
342         z.print();
343     }
344     return 0;
345 }
原文地址:https://www.cnblogs.com/tom987690183/p/4025156.html