信息学奥赛一本通 1211:判断元素是否存在 数学递推

221 阅读1分钟

信息学奥赛一本通### 1211:判断元素是否存在

拿题目给的样例套题目的公式就可以推出来结果: image.png

四种情况

第一种:

我们可以反着推,假设我们已经知道了2k+1=22,我们用y来代替22

y=2k+1y = 2k+1

k=(y1)/2k=(y-1)/2

这个时候我们推出来的k值与题目输入的k值如果相同,那么就说明y是我们要找的值。

第二种情况:

答案可能在右半部分,即3k+13k+1 部分,那我们求k值的公式就是:

k=(y1)/3 k=(y-1)/3

第三种情况:

2k+1,3k+1找到的值都是一样的,比如,当k=0,x=1时,

image.png 2k+1,3k+1求出的值都是1。

公式为:

(k=(y1)/2)and(k=(y1)/3)(k=(y-1)/2 )and( k=(y-1)/3)

第四种可能:

题目输入的k值和x值是同一个数值,那就不用找了,直接返回。

code

#include<iostream>
using namespace std;

int k;
int find(int x)
{
	
	//四种情况
	if(k==x)return 1;  
	if((x-1)%3==0&&(x-1)%2==0) return find((x-1)/3)||find((x-1)/2);
	if((x-1)%3==0) return find((x-1)/3);
	if((x-1)%2==0) return find((x-1)/2); 
		

	
return 0;//没找到就return 0;
}

int main()
{	char c;
    int x;cin>>k>>c>>x;  //输入k c x其中c是','

	if(find(x))//如果找到了
    cout<<"YES"<<endl;	
	else cout<< "NO"<<endl;

	
	return 0;
}