小红的真真假假签到题题(构造+思维)

Posted MangataTS

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了小红的真真假假签到题题(构造+思维)相关的知识,希望对你有一定的参考价值。

题目链接

https://ac.nowcoder.com/acm/contest/23479/K

题面

思路

这道题的构造方法挺多的,我说两个我觉得可以的构造方法吧

构造一

我们将这个数x转化为二进制后,然后再复制该二进制并添加到之前的二进制后面

构造二

我们直接将x转化为二进制后,在这个二进制后面添加30个0然后再添加x那么就是 ( ( 1 < < 30 ) + 1 ) ((1<<30)+1) ((1<<30)+1)的倍数

代码

构造一

#include<bits/stdc++.h>
using namespace std;
//----------------自定义部分----------------
#define ll long long
#define mod 1000000007
#define endl "\\n"
#define PII pair<int,int>
#define INF 0x3f3f3f3f

int dx[4] = -1, 0, 1, 0, dy[4] = 0, 1, 0, -1;

ll ksm(ll a,ll b) 
	ll ans = 1;
	for(;b;b>>=1LL) 
		if(b & 1) ans = ans * a % mod;
		a = a * a % mod;
	
	return ans;


ll lowbit(ll x)return -x & x;

const int N = 2e6+10;
//----------------自定义部分----------------
ll x;

int main()

	std::ios::sync_with_stdio(false);
	std::cin.tie(nullptr);
	std::cout.tie(nullptr);
	
	cin>>x;
	vector<ll> a,b;
	while(x)
		a.push_back(x%2);
		b.push_back(x%2);
		x/=2;
	
	a.insert(a.end(),b.begin(),b.end());
	ll l = a.size();
	ll ans = 0;
//	for(int i = l-1;i >= 0; --i) 
//		cout<<a[i];
//	
//	cout<<endl;
	for(ll i = l-1; i >= 0; --i) 
		ans = ans * 2 + a[i];
	
	cout<<ans<<endl;
	return 0;

构造二

#include<bits/stdc++.h>
using namespace std;
#define ll long long
int main()
    ll x;
    cin>>x;
    cout<<(x<<30)+x;

以上是关于小红的真真假假签到题题(构造+思维)的主要内容,如果未能解决你的问题,请参考以下文章

2022牛客寒假算法基础集训营 4 全部题解

2022牛客寒假算法基础集训营4 ABCDEFGHIJKL

真真真真真签到题(计算几何)

E.小红的公倍数(set)

E.小红的公倍数(set)

B. String LCM1000 / 思维