SGU 193 解题手记
求出最大的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(); } |
4 Responses
RSS输出的代码行号和代码的对应似乎有问题
Reply
可否截图看看?我这里看不到问题。
Reply
你怎么也不上IM啊..
Reply
我不能长期在线,有事请Email我,谢谢。
Reply
Top Seven
Recent Comments
Categories
Blogroll
Login
Sponsor