CF-1110C-Meaningless Operations

题意:

输入q,然后输入q个a,对于每个a,找到一个b,使gcd(a ^ b, a & b)最大,输出这个最大的gcd;

思路:

用k表示a二进制最高位的二进制编号,1,2,4,8对应1,2,3,4;

假如a不是 (1 << k) - 1这种形式的,那么总能找到一个b使a ^ b == (1 << k) - 1,而a & b == 0,这个时候gcd一定最大。如果a是 (1 << k) - 1,那么因为b不能为0,所以凑不出 (1 << k) - 1,没办法只能暴力了,因为(1 << k) - 1这样的形式的a也只有24个,所以我们要事先打表,否则应该会超时

打表代码:

#include "bits/stdc++.h"
using namespace std;
int main() {
    for (int i = 3; i <= (1 << 25) - 1; i = i << 1 | 1) {
        int max_gcd = 0;
        for (int j = 1; j < i; j++) {
            max_gcd = max(max_gcd, __gcd(i ^ j, i & j));
        }
        printf("mp[%d] = %d;\n", i, max_gcd);
    }
    return 0;
}

提交代码:

C - Meaningless Operations GNU C++11 Accepted 30 ms 0 KB
#include "bits/stdc++.h"
using namespace std;
map<int, int> mp;
int main() {
    mp[3] = 1;
    mp[7] = 1;
    mp[15] = 5;
    mp[31] = 1;
    mp[63] = 21;
    mp[127] = 1;
    mp[255] = 85;
    mp[511] = 73;
    mp[1023] = 341;
    mp[2047] = 89;
    mp[4095] = 1365;
    mp[8191] = 1;
    mp[16383] = 5461;
    mp[32767] = 4681;
    mp[65535] = 21845;
    mp[131071] = 1;
    mp[262143] = 87381;
    mp[524287] = 1;
    mp[1048575] = 349525;
    mp[2097151] = 299593;
    mp[4194303] = 1398101;
    mp[8388607] = 178481;
    mp[16777215] = 5592405;
    mp[33554431] = 1082401;
    int t, n;
    scanf("%d", &t);
    while (t--) {
        scanf("%d", &n);
        if (mp.count(n)) {
            printf("%d\n", mp[n]);
            continue;
        }
        int k = 0;
        while (n) {
            k++;
            n >>= 1;
        }
        printf("%d\n", (1 << k) - 1);
    }
    return 0;
}

这次比赛得到的教训是打表程序跑出来的结果一定要是可以直接复制粘贴的,比赛的时候前面的题本来就做的不够快,然后当时打表程序不够好,这题还手敲了switch,结果来不及提交了。还是map好,没有引号百分号,用printf输出比较方便。

原文地址:https://www.cnblogs.com/Angel-Demon/p/10355992.html

时间: 2024-10-31 10:48:37

CF-1110C-Meaningless Operations的相关文章

C. Meaningless Operations Codeforces Global Round 1 异或与运算,思维题

C. Meaningless Operations time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Can the greatest common divisor and bitwise operations have anything in common? It is time to answer this question.

CF - 1110 C Meaningless Operations

题目传送门 题解: 首先根据观察,很容易发的是: x != (1<<k) - 1 时候 答案就是, 将x二进制下再最高位后的0都变成1. 然后就是考虑 x == (1<<k) - 1的时候 同样根据观察可以得到  b ^ x =  x - b, b&x = b 所以就是将x拆成2个数, 然后这2个数的gcd最大. 我们就最后找x的因子. 如 x = b * c 那么们就可以把2个数分成 c , (b-1) * c,gcd 为 c. 或者 b , b * (c-1)   gc

【Codeforces Global Round 1 C】Meaningless Operations

[链接] 我是链接,点我呀:) [题意] 给你一个a 让你从1..a-1的范围中选择一个b 使得gcd(a^b,a&b)的值最大 [题解] 显然如果a的二进制中有0的话. 那么我们就让选择的b的二进制中对应的位置为1 剩下全为0就好 这样a的二进制全都变成1之后就是答案了(gcd的右边是0). 但是如果a的二进制里面全是1的话. 就没办法这么构造了 这里有两种情况. ①.1的个数是偶数 那么就101010这样构造 另外一个数就是010101 答案就是010101转换成十进制 ②.1的个数是奇数

CF1110C Meaningless Operations

思路: 令x为满足2x <= a的最大的x.如果a的二进制表示中包含0,则将b构造为(2x+1 - 1) ^ a即可:否则gcd(a ^ b, a & b) = gcd(2x+1 - 1 - b, b) = gcd(2x+1 - 1, b),要令此式最大,b应为(2x+1 - 1)的最大非平凡因子. 实现: 1 #include <bits/stdc++.h> 2 using namespace std; 3 4 inline int max_fac(int x) 5 { 6 f

CodeForces Golbal Round 1

CodeForces Golbal Round 1 CF新的比赛呢(虽然没啥区别)!这种报名的人多的比赛涨分是真的快.... 所以就写下题解吧. A. Parity 太简单了,随便模拟一下就完了. B. Tape 显然就是先找一个长的把所有的全部覆盖,然后可以在上面丢掉\(k-1\)段间隙. 那么把两两之间的间隙长度拿出来排序就可以了. C. Meaningless Operations 如果\(a\)不等于\(2^k-1\)的形式,那么令\(S=2^k-1\),其中\(2^{k-1}<a<2

[Codeforces]Codeforces Global Round 1

A - Parity 题意 给定一个$b$进制数,要求输出它在十进制下是奇数还是偶数. 分析 花了我略多的时间,首先题目中给的数字范围很大,不能直接转化为10进制. 分析性质,发现只有奇数乘奇数还是奇数,其他都是偶数. 对奇数进制和偶数进制分类讨论. 偶数进制看最低位的奇偶性,如果是奇数那么这个数就是奇数,不然是偶数. 奇数进制看每一位上奇数的个数,如果是奇数个奇数就是奇数,不然是偶数. 代码 1 #include <bits/stdc++.h> 2 using namespace std;

Codeforces Global Round 1

A. Parity 签. 1 #include <bits/stdc++.h> 2 using namespace std; 3 4 #define N 100010 5 int b, k, a[N]; 6 7 int main() 8 { 9 while (scanf("%d%d", &b, &k) != EOF) 10 { 11 int res = 0; 12 for (int i = 1; i <= k; ++i) scanf("%d&

Codeforces Global Round 1 (A-E题解)

Codeforces Global Round 1 题目链接:https://codeforces.com/contest/1110 A. Parity 题意: 给出{ak},b,k,判断a1*b^(k-1)+a2*b^(k-2)+...+ak*b^0的奇偶性. 题解: 暴力求模2意义下的值就好了. 代码如下: #include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 2e5+5; int

CF#52 C Circular RMQ (线段树区间更新)

Description You are given circular array a0,?a1,?...,?an?-?1. There are two types of operations with it: inc(lf,?rg,?v) - this operation increases each element on the segment [lf,?rg] (inclusively) by v; rmq(lf,?rg) - this operation returns minimal v