zoukankan      html  css  js  c++  java
  • 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.

    Suppose you are given a positive integer aa. You want to choose some integer bb from 11 to a1a−1 inclusive in such a way that the greatest common divisor (GCD) of integers aba⊕b and a&ba&b is as large as possible. In other words, you'd like to compute the following function:

    f(a)=max0<b<agcd(ab,a&b).f(a)=max0<b<agcd(a⊕b,a&b).

    Here ⊕ denotes the bitwise XOR operation, and && denotes the bitwise AND operation.

    The greatest common divisor of two integers xx and yy is the largest integer gg such that both xx and yy are divided by gg without remainder.

    You are given qq integers a1,a2,,aqa1,a2,…,aq. For each of these integers compute the largest possible value of the greatest common divisor (when bb is chosen optimally).

    Input

    The first line contains an integer qq (1q1031≤q≤103) — the number of integers you need to compute the answer for.

    After that qq integers are given, one per line: a1,a2,,aqa1,a2,…,aq (2ai22512≤ai≤225−1) — the integers you need to compute the answer for.

    Output

    For each integer, print the answer in the same order as the integers are given in input.

    Example
    input
    Copy
    3
    2
    3
    5
    
    output
    Copy
    3
    1
    7
    
    Note

    For the first integer the optimal choice is b=1b=1, then ab=3a⊕b=3, a&b=0a&b=0, and the greatest common divisor of 33 and 00 is 33.

    For the second integer one optimal choice is b=2b=2, then ab=1a⊕b=1, a&b=2a&b=2, and the greatest common divisor of 11 and 22 is 11.

    For the third integer the optimal choice is b=2b=2, then ab=7a⊕b=7, a&b=0a&b=0, and the greatest common divisor of 77 and 00 is 77.

    这个题目有1500的分数,我觉得偏高了,这个题目比较简单,不过第一眼看上去可能会觉得还比较难,但是仔细思考一下异或运算和与运算就会发现那么一点点的规律

    就是与和异或运算是相反的,再加上第一个样例告诉你,0和3 的最大公约数是3,就会发现一点,如果一个数转化成二进制,且不是每一个位置都是1,那么就可以变成全部是1的数和0求最大公约数,这个肯定是最大的,其实就是你要让一个数是0,另一个数最大。

    如果全是1,你就会发现这个数肯定是个奇数,如果他可以分成奇数倍,那一个最大公约数肯定是一倍。这个可以自己好好想清楚。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include <vector>
    #include <algorithm>
    using namespace std;
    typedef long long ll;
    const int maxn = 1e5 + 100;
    
    int main()
    {
    	int q;
    	cin >> q;
    	while(q--)
    	{
    		ll n, num=0,ans=0;
    		int flag = 0;
    		cin >> n;
    		while(n)
    		{
    			if (n % 2 == 0) flag = 1;
    			n >>= 1;
    		    num++;
    		}
    		for (int i = 1; i <= num; i++)
    		{
    			ll len = 1;
    			for (int j = 1; j < i; j++)
    			{
    				len *= 2;
    			}
    			ans += len;
    		}
    		if(flag) printf("%lld
    ", ans);
    		else
    		{
    			flag = 0;
    			for(int i=3;i<10000;i+=2)
    			{
    				if(ans%i==0)
    				{
    					printf("%lld
    ", ans / i);
    					flag = 1;
    					break;
    				}
    			}
    			if (!flag) printf("1
    ");
    		}
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    MySQL-5.7.26解压版安装教程
    asp.net core 系列之Configuration
    java之初识hibernate
    java框架学习系列
    java之struts2之异常处理
    java之struts2之ajax
    java之servlet之文件下载
    列出连通集
    幸运数
    英文单词排序
  • 原文地址:https://www.cnblogs.com/EchoZQN/p/10630172.html
Copyright © 2011-2022 走看看