链接:https://ac.nowcoder.com/acm/problem/21477
来源:牛客网
示例1
输入
4 1
5
输出
ham
备注:
1 ≤ n ≤ 10^18,
1 ≤ m ≤ 10^5,
1 ≤ ai ≤ 10^18。
解题思路:
按照题意dfs,如果当前堆的size出现过了就return,不往下继续搜了,因为已被搜过。
然后dfs完之后,所有分堆的过程中出现的size都被存下来了。
遍历看看有没有出现过。
代码块:
void dfs(ll n){
if(mp[n]) return;
mp[n]=1;
dfs(n/2);dfs(n-n/2);
}
int main(){
read(n);read(m);
for(int i=0;i<m;i++){
read(a[i]);sum+=a[i];
}
if(sum!=n){
puts("ham");
}else{
dfs(n);
for(int i=0;i<m;i++){
if(!mp[a[i]]){
puts("ham");
return 0;
}
}
puts("misaka");
}
return 0;
}