私の北京大学ACM POJ 1012解答

6917 ワード

最初は簡単だと思っていましたが、やっているうちに注意しなければならないことが多いことに気づきました.この問題は必ず計算した値を保存しなければなりません.
そうでないとTLEになります.
Source Code
Problem: 1012
User: absolute
Memory: 204K
Time: 47MS
Language: C++
Result: Accepted
  • Source Code
  • #include <stdio.h>
    void POJ1012();
    //int result[]={0,2,7,5,30,169,441,1872,7632,1740,93313,459901,1358657,2504881};
    int main()
    {
    POJ1012();
    return 0;
    }
    void POJ1012()
    {
    int i,k;
    int result[14]={0};
    scanf("%d",&k);
    while(k!=0)
    {
    // printf("%d
    ",result[k]);

    int leftguys,m,flag,cur,next;
    i=1;
    while(true)
    {
    if(result[k]!=0)
    {
    printf("%d
    ",result[k]);
    break;
    }
    //m ,cur , 0
    //m k+1 k+1 1,
    // K+1 ,cur k k+1
    m=(k+1)*i;
    for(int j=0;j<2;j++)
    {
    cur=-1;
    flag=true;
    for(leftguys=2*k;leftguys>k;--leftguys)
    {
    next = (cur+m)%leftguys;
    if(next<k)
    {
    flag=false;
    break;
    }
    cur = next-1;
    }
    if(flag)
    {
    printf("%d
    ",m);
    result[k]=m;
    break;
    }
    m=(k+1)*i+1;
    }
    if(flag)
    break;
    ++i;
    }
    scanf("%d",&k);
    }
    }