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

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;
}
posted on 2012-05-01 11:29  夜->  阅读(243)  评论(0编辑  收藏  举报