题目描述
有一个集合M是这样生成的:(1) 已知k是集合M的元素; (2) 如果y是M的元素,那么,2y+1和3y+1都是M的元素;(3) 除了上述二种情况外,没有别的数能够成为M的一个元素。
问题:任意给定k和x,请判断x是否是M的元素。这里的k是无符号整数,x 不大于 100000,如果是,则输出YES,否则,输出NO。
输入
输入整数 k 和 x, 逗号间隔。输入整数 k 和 x, 逗号间隔。
输出
如果是,则输出 YES,否则,输出NO。
样例输入
0,22
样例输出
YES
#include<bits/stdc++.h>
using namespace std;
int k,m,flag=0;
void dfs(int k,int m)
{
if(k>m) {
flag=0;
return;
}
if(k==m) {
flag=1;
return;
}
dfs(2*k+1,m);//可以是0*2+1=x 再x*3+1
dfs(3*k+1,m);//return 的作用就是使k得以不断得*2+1或*3+1,把所有不同顺序的两个公式使用的结果都判断一遍
}
int main(){
int temp;
scanf("%d%d",&k,&m);
if(k>m){
temp=m;
m=k;
k=temp;
}
dfs(k,m);
if(flag) printf("YES");
else printf("NO");
return 0;
}
dfs(2*k+1,m);
dfs(3*k+1,m);
大概情况就是先一根筋全部都是2*k+1,若最终超出m,则试着把最后一次改为3*k+1……以此类推(类似走迷宫,先一直往上,失败后尝试把倒数一步改为向右……)