codeforces1110C. Meaningless Operations

题目链接 琪亚娜世界第一可爱!

给出a求对应值
f ( a ) = max ⁡ 0 < b < a g c d ( a ⊕ b , a & b ) f(a)=\max _{0<b<a} gcd(a \oplus b, a \& b) f(a)=0<b<amaxgcd(ab,a&b)


根据XOR 与 AND 运算的不同,分为 gcd(0,num) 和打表


#include <stdio.h>
#include <climits>
#include <cstring>
#include <time.h>
#include <math.h>
#include <iostream>
#include <algorithm>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <utility>
#include <vector>
#include <string>

#define INF 0x3f3f3f3f
#define ll long long
#define Pair pair<int,int>
#define re return

#define getLen(name,index) name[index].size()
#define mem(a,b) memset(a,b,sizeof(a))
#define Make(a,b) make_pair(a,b)
#define Push(num) push_back(num)
#define rep(index,star,finish) for(register int index=star;index<finish;index++)
#define drep(index,finish,star) for(register int index=finish;index>=star;index--)
using namespace std;

int awsl,_;
map<int,int> ans;
int main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL);

    ans[3]=1,ans[7]=1,ans[15]=5;
    ans[31]=1,ans[63]=21;ans[127]=1;
    ans[255]=85;ans[511]=73;ans[1023]=341;
    ans[2047]=89;ans[4095]=1365;ans[8191]=1;
    ans[16383]=5461;ans[32767]=4681;ans[65535]=21845;
    ans[131071]=1;ans[262143]=87381;ans[524287]=1;
    ans[1048575]=349525;ans[2097151]=299593;
    ans[4194303]=1398101;ans[8388607]=178481;
    ans[16777215]=5592405;ans[33554431]=1082401;


    cin>>awsl;
    while(awsl--){
        cin>>_;
        if(ans.find(_)!=ans.end()){
            cout<<ans[_]<<endl;
            continue;
        }

        int kizunaAI=0,temp=_,pow=1;
        while(temp){
            int HuaQ=1;
            if(temp & 1){
                HuaQ=0;
            }
            kizunaAI+=HuaQ*pow;

            temp=temp>>1;
            pow*=2;
        }

        ans[_]=_^kizunaAI;
        cout<<ans[_]<<endl;
    }

    re 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值