第一个是进制转换的问题 十进制转换n进制
进制转化最需要明白的就是这个图了
得到的数字再取反就是转化的数字了 先取余后除就行了
牛客 周赛刚好考了这个
题
进制的好题了 考的很好
题
这题很有思维难度 首先我们可以想到2个k 从一个k入手 一个k满足的 再看另一个k是否满足 这种检测的时间复杂度
是Ologk(n)是很小的 然后关键在于数字的统计 很明显有n位那就是2的n次方种 这么一看时间好大要超了
其实不然 题目限定了long long范围 再是k的指数递增很快 某一时刻那个数字下次再进位大于1e18了 我们就该结束了
对于k为3的情况 请多来到30多次 2的30多次方还是不会超时的 所以代码就这么简单写出来了 非常巧妙
for(int i=0;i<=60;i++)
{
int add=qpow(k1,i);
for(auto j:v)
{
q.push(j+add);
if(check(j+add)&&j+add>1){
cout<<"YES"<<endl;
cout<<j+add<<endl;return ;
}
}
while(q.size()){
v.push_back(q.front());q.pop();
}
// if(add*k1>1e18)break;//别这样写 会炸掉的
if(k1>(1e18/add))break;
这一步很有灵魂
}
if(k1>(1e18/add))break;这一步很重要 一定要改变书写习惯
检查的代码 这一步模仿的就是 转进制的步骤
bool check(int x)
{
int w=x%k2;
if(x==1||x==0)return 1;
if(w==0||w==1){
return check(x/k2);
}
else return 0;
}
于是就写完了
标签:break,return,进制,int,---,数字,小结,1e18 From: https://www.cnblogs.com/LteShuai/p/18403261