CodeForces - 893B Beautiful Divisors(数学,二进制)

Description

Recently Luba learned about a special kind of numbers that she calls
beautiful numbers. The number is called beautiful iff its binary
representation consists of k + 1 consecutive ones, and then k
consecutive zeroes.

Some examples of beautiful numbers:

12 (110); 1102 (610); 11110002 (12010); 1111100002 (49610). More
formally, the number is beautiful iff there exists some positive
integer k such that the number is equal to (2k - 1) * (2k - 1).

Luba has got an integer number n, and she wants to find its greatest
beautiful divisor. Help her to find it!

Input

The only line of input contains one number n (1 ≤ n ≤ 105) — the
number Luba has got.

Output

Output one number — the greatest beautiful divisor of Luba’s number.
It is obvious that the answer always exists.

Examples

input

3

output

1

input

992

output

496

思路

题目中定义了一种数,叫做美丽的数,定义是这样的:

一个数的二进制如果有连续的 k+1 个1和 k <script type="math/tex" id="MathJax-Element-139">k</script>个0组成,那么这个数是美丽的数

比如,当:

  • k=0 :1
  • k=1 :110
  • k=2 :11100
  • k=3 :1111000

题目给出了一个数n,让你从它的因子里面找出一个最大的美丽的数

枚举美丽的数,然后与判断是否可以整除

代码

c++:

#include <bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
int dec(string s)
{
    int len=s.length(),ans=0;
    for(int i=0; i<len; i++)
        ans+=(s[i]-'0')*(int)pow(2,len-1-i);
    return ans;
}
int main()
{
    int n,p=1;
    string i="110";
    scanf("%d",&n);
    while(dec(i)<=n)
    {
        if(n%dec(i)==0)
            p=dec(i);
        i="1"+i+"0";
    }
    printf("%d\n",p);
    return 0;
}

python3:

n=int(input())
i = '110'
p=1
while int(i,2)<=n:
  if n%int(i,2)==0:
    p=int(i,2)
  i='1'+i+'0'
print(p)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值