/*
zoj_2705 递推
引用watershi神牛的解释:
从描述中可以知道,完成第一刀之后后面的发展是确定的,但由于规模很大,
我们不可能去枚举第一刀的情况。可以反过来思考,事实上,知道了最后的
结果,比如最后是两个a*b的矩形,那么我们也可以反过来推出之前较大的那
个矩形依次是2a*b, 3a*b, 5a*b, 8a*b …,这不正是著名的Fibonacci数列么。
目标是a*b尽量小,也就是要找最大的Fibonacci数f,使得m%f==0||n%f==0,
10^9内的Fibonacci数不过几十个,枚举就可以了,答案就是m*n-m*n/f。注
意要用long long。
*/
#include <iostream>
#include <cstdio>
#define LL long long
#define N 1000000000
using namespace std;
LL f[100];
int main()
{
LL i,m,n,mark,maxi;
f[1]=1; f[2]=1;
for( i=3;i<100;i++ )
{
f[i]=f[i-2]+f[i-1];
if( f[i]>N ) break;
}
while( cin>>m>>n )
{
maxi=max( m,n );
for( i=1;f[i]<=maxi;i++ )
{
if( m%f[i]==0 || n%f[i]==0 )
mark=f[i];
}
cout<<m*n-m*n/mark<<endl<<endl;
}
return 0;
}
zoj 2705 Dividing a Chocolate
最新推荐文章于 2017-05-15 21:56:19 发布