题意:一块三维巧克力,手掰和刀切,最少几次,可分为n*m*k个单元块
题解:手掰,要有n*m*k个就要掰n*m*k下,当然,你掰下最后第二个的时候,最后一个就自然出现了,所以手掰是n*m*k-1个;
刀切, 可以上下叠起来切, 所以每一维的处理办法一样, 切一半+(一半的一半)+(一半的一半的一半)+..........,向上取整。
//
#include<iostream>
#include<cstdio>
using namespace std;
__int64 f(__int64 n)
{
int ans=0;
while(n>1)
{
ans++;
if(n%2) n=(n/2)+1;
else n/=2;
}
return ans;
}
int main()
{
__int64 T;
cin>>T;
for(int i=1; i<=T; i++){
__int64 n,m,k;
__int64 ans1=0, ans2=0;
cin>>n>>m>>k;
ans1 = n*m*k-1;
ans2 = f(n)+f(m)+f(k);
cout<<"Case #"<<i<<": "<<ans1<<" "<<ans2<<endl;
}
return 0;
}
code