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