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)