第一个是进制转换的问题 十进制转换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;
}
于是就写完了