列表

详情


NC53218. 小w的进制转换

描述

w在将一个10进制数转换为二进制数的时候,不小心将“0”和“1”搞混了,也就是说本来该输出1的时候他输出了0,本来该输出0的时候他又输出了1。而他在输出答案的时候,又将输出的左右顺序搞混了。举个例子:小w6转换为二进制,本来6的二进制表示为110,但是小w转换成了001,输出时又倒了过来变成100。现在假设评测姬中的评测数据是1,2,3,4,5,6...n也就是从1n,问小wAC其中的多少组测试案例?

输入描述

第一行为一个整数T,表示有T组数据
接下来T行,每行一个整数n,表示评测姬中的数据是从1到n

输出描述

对于每个n,输出一行一个整数表示小w能通过的案例组数。

示例1

输入:

3
1
2
10

输出:

0
1
2

说明:

1在二进制下表示为1,而小w转换成了0,WA
2在二进制下表示为10,小w转换成了01,输出时倒置变成10,AC
10在二进制下表示为1010,小w转换成了0101,输出时倒置变成了1010,AC

原站题解

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

C++(g++ 7.5.0) 解法, 执行用时: 58ms, 内存消耗: 1360K, 提交时间: 2022-09-22 21:50:28

#include<bits/stdc++.h>
#define int long long
using namespace std;
int t, n;
int check(int len){
	int x = 0, ans = (n >> (len >> 1));
	x = ans << (len >> 1);
	for(int i = 1; i <= (len >> 1); i ++){
		if(!((1ll << (i - 1)) & ans)) x |= (1ll << (len / 2 - i));
	}	
	if(x <= n) return ans;
	return ans - 1;
}
signed main(){
	scanf("%d", &t);
	while(t --){
		scanf("%lld", &n);
		int bit = 0, m = n;
		for(; m; m >>= 1) bit ++;
		if(bit & 1)	printf("%lld\n", (1ll << (bit >> 1)) - 1);	
		else printf("%lld\n", check(bit));
	}	
	return 0;
}

C++14(g++5.4) 解法, 执行用时: 61ms, 内存消耗: 1388K, 提交时间: 2019-09-27 22:15:51

#include<bits/stdc++.h>
using namespace std;
#define ll long long
int t,m,i,j,ans,o[65536];
ll n;
int main()
{
    scanf("%d",&t);
    while(t--)
    {
        scanf("%lld",&n);
        for(m=0;1LL<<m<=n;m++);
        ans=0;
        for(i=1;i<<1<m;i++)ans+=1<<i-1;
        if(!(m&1))
        {
            m>>=1;
            i=n>>m;
            ans+=i-(1<<m-1);
            for(j=0;i;i>>=1)j=j<<1|(!(i&1));
            if(j<=(n&(1<<m)-1))ans++;
        }
        printf("%d\n",ans);
    }
    return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 66ms, 内存消耗: 1512K, 提交时间: 2019-10-29 20:10:47

#include<bits/stdc++.h>
#define int long long
using namespace std;
int t,n;
int check(int len)
{
	int x=0,ans=(n>>(len>>1));
	x=ans<<(len>>1);
	for(int i=1;i<= (len >> 1); i ++)if(!((1ll<<(i-1))&ans))x|=(1ll<<(len/2-i));
	if(x<=n)return ans;
	return ans-1;
}
signed main()
{
	scanf("%lld",&t);
	while(t--)
   {
		scanf("%lld",&n);
		int bit=0,m=n;
		for(;m;m>>=1)bit++;
		if(bit&1)printf("%lld\n",(1ll<<(bit>>1))-1);	
		else printf("%lld\n",check(bit));
	}
	return 0;
}

上一题