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)   gcd为b

代码:

/*
code by: zstu wxk
time: 2019/02/08
*/
#include<bits/stdc++.h>
using namespace std;
#define Fopen freopen("_in.txt","r",stdin); freopen("_out.txt","w",stdout);
#define LL long long
#define ULL unsigned LL
#define fi first
#define se second
#define pb push_back
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define lch(x) tr[x].son[0]
#define rch(x) tr[x].son[1]
#define max3(a,b,c) max(a,max(b,c))
#define min3(a,b,c) min(a,min(b,c))
typedef pair<int,int> pll;
const int inf = 0x3f3f3f3f;
const int _inf = 0xc0c0c0c0;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const LL _INF = 0xc0c0c0c0c0c0c0c0;
const LL mod =  (int)1e9+7;
const int N = 1e5 + 100;
int q, n;
int ans[(1<<25) + 100];
int _pow[N];
int cal(int x){
    int ret = 1;
    for(int i = 2; i * i <= x; ++i){
        if(x%i == 0){
            ret = max({ret, i, x/i});
        }
    }
    return ret;
}
void init(){
    ans[2] = 3; ans[3] = 1;
    int t = 8;
    for(int i = 3; i <= 25; ++i){
        int m = t - 1, z = t - 2;
        while(!ans[z]){
            ans[z] = m;
            --z;
        }
        ans[m] = cal(m);
        t *= 2;
    }
}
void Ac(){
    for(int i = 1; i <= q; ++i){
        scanf("%d", &n);
        printf("%d\n", ans[n]);
    }
}
int main(){
    init();
    while(~scanf("%d", &q)){
        Ac();
    }
    return 0;
}

  

原文地址:https://www.cnblogs.com/MingSD/p/10356134.html

时间: 2024-11-13 02:13:58

CF - 1110 C Meaningless Operations的相关文章

CF 1110 D/E

CF 1110 D. Jongmah 题目大意:给你?\(n\)个瓷砖,每块瓷砖上有一个数字?\(a_i,(1\leq a_i\leq m)\).你可以将三个有连续数字?\((比如3,4,5)\)的瓷砖或者三个数字相同?\((比如7,7,7)\)的瓷砖组成一个三元组.每个瓷砖只能用一次.问最多可以得到多少个三元组.? 比赛的时候好像全场A穿,然而并没有想到 (TAT. 一开始想到\(DP\),但是?觉得状态数太大:于是想了奇奇怪怪的贪心,但是都能找到反例. 这道题的关键是要发现一个性质:同一位置

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.

【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的个数是奇数

CF 1110 D. Jongmah

D. Jongmah 链接 题意: 一些数字,有两种方式组成一个三元组,[x,x,x],[x,x+1,x+2],每个数字只能用一次,求最多组成多少三元组. 分析: 因为每三个[x,x+1,x+2]是可以拆成[x,x,x],[x+1,x+1,x+1],[x+2,x+2,x+2]的,所以可以认为对于以x开始的[x,x+1,x+2]最多有两个. 于是可以dp[i][x][y]表示到第i个数字,存在x个[i-1,i,i+1],y个[i,i+1,i+2],最多组成多少个三元组(这些三元组的右端点在i以内,

CF 1110 E. Magic Stones

E. Magic Stones 链接 题意: 给定两个数组,每次可以对一个数组选一个位置i($2 \leq i \leq n - 1$),让a[i]=a[i-1]+a[i+1]-a[i],或者b[i]=b[i-1]+b[i+1]-b[i].问进行一些操作后,a和b能否相同. 分析: 考虑一次操作会变成什么样子. a b c a a+c-b c 我们发现这些数字差分后是不变的.于是对两个数组差分后,排序,看是否一样即可.注意判一下1和n是否相等. 代码: #include<cstdio> #in

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

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)

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

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