摘要:构造算法与数论的结合,巧妙之处在于我们要自己模拟一遍计算过程然后从中找出特殊点。
题目原地址如下: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 }
标签:题目,ll,codeforces,如下,集合,Plus,Multiply From: https://www.cnblogs.com/johnsonstar/p/16637304.html