0%

51nod-2512-重排列得到2的幂

题目:

小b有一个数n,现在她想把n的每一位重排列,使得得到的结果为2的幂次。

请问小b能得到2的幂次吗?

注意重排列后不允许有前导0。

样例解释:46重排列成64,为2^6。

输入

输入一个数N,其中1≤N≤10^9

输出

满足条件,输出“true”;
不满足,则输出“false”。

输入样例

1
46

输出样例

1
true

题解:

当n的数字个数与某2的次幂数字个数相同时,比较各个数字出现的次数,如果相同则为true

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include<stdio.h>
#include<algorithm>
#include<cmath>
using namespace std;
int b[10];
int a[10];
int len(int n){
int l = 0;
while(n){
l++;
n /= 10;
}
return l;
}
bool cmp(){
for(int i = 0; i < 10; i++){
if(a[i] != b[i])
return false;
}
return true;
}
int mi(int m){
int now = 1;
for(int i = 0; i < m; i++)
now *= 2;
return now;
}
void get(int p){
for(int i = 0; i < 10; i++)
b[i] = 0;
while(p){
b[p%10]++;
p /= 10;
}
}
int main()
{
int n;
scanf("%d",&n);
bool flag = false;
int i = 0;
int p = n;
while(p){
a[p%10]++;
p /= 10;
}
while(1){
if(len(mi(i)) == len(n)){
get(mi(i));
if(cmp()){
flag = true;
break;
}
}
if(len(mi(i)) > len(n))
break;
i++;
}
if(flag)
printf("true");
else
{
printf("false");
}
return 0;
}