常规求法会超时 发现了一个规律 证明的话 亲 你自己想吧
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;
}