版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34454069/article/details/88756270
分析:
显然,一个萌的数,必然满足其所有的后缀都是萌的数。
所以,我们可以通过不停地在最高位加值来得到新的萌数。
还有一个结论:
设这个萌的数表示为:
则其必然满足:
即
必然含有4这个因数
所以
换言之,最高位对其合法性不造成影响
因此,不需要先加入再判断,直接判断当前合不合法,然后最高位分别加0或1即可。
关于如何判断合不合法。。。直接高精暴力取模即可。。。。(因为能询问到的最大的萌数也不超过200位。。。我怎么知道这个结论啊喂)
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#define SF scanf
#define PF printf
#define MAXN 100010
using namespace std;
struct BigInt{
char a[MAXN];
short int len;
void add(int pos){
a[pos]=1;
len=pos;
}
void div2(){
int les=0;
for(int i=len;i>=0;i--){
les=les*10+a[i];
a[i]=les/2;
les%=2;
}
while(a[len]==0)
len--;
}
void Print(){
for(int i=len;i>=0;i--)
PF("%d",a[i]);
}
}tmp;
bool Modulo2k(BigInt a,int k){
while(k){
a.div2();
k--;
}
return a.a[0]&1;
}
vector<BigInt> now,add1,add0;
int main(){
freopen("quiz.in","r",stdin);
freopen("quiz.out","w",stdout);
int n;
SF("%d",&n);
now.push_back(tmp);
int len=0;
while(1){
for(int i=0;i<now.size();i++)
if(Modulo2k(now[i],len)==0){
tmp=now[i];
add0.push_back(tmp);
tmp.add(len);
add1.push_back(tmp);
n--;
if(n==0){
tmp.Print();
return 0;
}
}
now.clear();
for(int i=0;i<add0.size();i++)
now.push_back(add0[i]);
for(int i=0;i<add1.size();i++)
now.push_back(add1[i]);
add0.clear();
add1.clear();
len++;
}
}