学习随笔——codeforces题目Plus and Multiply解答
摘要:构造算法与数论的结合,巧妙之处在于我们要自己模拟一遍计算过程然后从中找出特殊点。
题目原地址如下:https://codeforces.com/problemset/problem/1542/B
题目截图如下:
关键词:构造算法,数论,*1500
简要翻译:一个无穷集合中的元素由如下规则生成:x=m*a或者x=m+b,其中a,b给定,m为集合元素。在生成初期,集合中包含1。现给定数k,要我们求出k是否在这个无穷集合内。
考察上述运算过程,我们可以知道,因为1的存在,上述生成过程一定存在一个分量为未乘b的量,只需按幂次依次遍历判断即可。
特别注意,当a=1时会出现死循环,需要特判。
代码如下:
1 #include <iostream> 2 #define ll long long 3 using namespace std; 4 ll a,b,n,l; 5 void solve(ll a,ll b,ll n){ 6 if (a==1){//特判情况 7 if ((n-1)%b==0){ 8 cout<<"YES"<<endl; 9 return ; 10 } 11 else{ 12 cout<<"NO"<<endl; 13 return ; 14 } 15 } 16 if ((n-1)%b==0){ 17 cout<<"YES"<<endl; 18 return ; 19 } 20 ll a1=a; 21 while (a1<=n){ 22 if ((n-a1)%b==0){ 23 cout<<"YES"<<endl; 24 return ; 25 } 26 a1*=a; 27 } 28 if (a1>n){ 29 cout<<"NO"<<endl; 30 return ; 31 } 32 } 33 int main(){ 34 cin>>l; 35 while(l--){ 36 cin>>n>>a>>b; 37 solve(a,b,n); 38 } 39 return 0; 40 }
分类:
codeforces
, 算法题笔记
标签:
codeforces
, 算法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报