poj 1781 In Danger

常规求法会超时  发现了一个规律 证明的话 亲 你自己想吧

http://poj.org/showsource?solution_id=10139647

#include <iostream>

#include <string>

#include <cstring>

#include <algorithm>

#include <cmath>

#include <cstdio>

using namespace std;



//const int N=99000001;

int k[30];

int main()

{

    int n,m;

    char c;

    for(int i=0;i<30;++i)

    {

        k[i]=(int)(pow(2,i));

    }

    while(cin>>n>>c>>m)

    {

        n=n*(int)(pow(10,m));

        if(n==0)

        break;

        int i;

        for(i=0;i<30;++i)

        {

            if(k[i]>n)

            break;

        }

        --i;

        cout<<(2*(n-k[i])+1)<<endl;

    }

    return 0;

}


超时代码 虽然超时 但当数据量小和m不等于2时可以用的着
#include <iostream>
#include <string>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cstdio>
using namespace std;

const int N=99000001;
int ans[N];
int main()
{
    int n,m;
    char c;
    ans[1]=1;
    for(int i=2;i<=N;++i)
    {
         ans[i]=(ans[i-1]+2-1)%i+1;
    }
    while(cin>>n>>c>>m)
    {
        if(n==0)
        break;
        n=n*(int)(pow(10,m));
        cout<<ans[n]<<endl;
    }
    return 0;
}

你可能感兴趣的:(poj)