列表

详情


NC214949. 牛牛的反函数

描述

牛牛定义了一个递归函数F(x),x为正整数且定义域范围



现在牛牛想要你编写一个程序实现这个函数的反函数功能,也就是说我们输入一个正整数y(),你要找到范围在内的正整数x,使得F(x)=y。
如果在内不存在任何一个正整数x使得F(x)=y。请输出"-1"(不含引号)代表无解,如果有多个满足条件的x,你只用随便输出一个大小在内的合法解即可

输入描述

第一行输入一个正整数表示有T组测试案例,对于每组案例:

输入一行一个正整数y,代表函数值。

输出描述

对于每组案例,输出一行一个整数代表问题的答案。

如果在不存在任意一个正整数的函数值等于给定的y,请输出"-1"。

否则请输出任意的x满足条件F(x)=y。要求x的范围在内。

示例1

输入:

11
1
2
3
4
5
6
7
8
9
10
1024

输出:

1
2
4
8
16
32
64
128
256
512
-1

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

Python3(3.9) 解法, 执行用时: 29ms, 内存消耗: 3964K, 提交时间: 2020-12-31 22:15:34

mx = int('1'+'0'*18)

def work():
    global mx
    x = 1; y = int(input()) - 1
    while y:
        if x ==1 or x == 2:
            x <<= 1
        else:
            if x&1:
                x <<= 1
            else:
                x -= 1
        y -= 1
        if x>mx:
            print(-1)
            return
    print(x)

t = int(input())
exec('work();'*t)

C++(clang++11) 解法, 执行用时: 3ms, 内存消耗: 352K, 提交时间: 2021-01-22 18:52:09

#include<bits/stdc++.h>
using namespace std;
long long start=(1LL<<59)+1,ans[123],t,y;
int main()
{
	for(int i=120;i;i--)
	{
		ans[i]=start;
		if(start%2==1)
		start++;
		else
		start/=2;
	}
	for(cin>>t;t--;)
	{
		cin>>y;
		cout<<(y<=120?ans[y]:-1LL)<<"\n";
	}
}

上一题