vijosP1279 Leave-绿光

题目描述:

将边长为正整数a,b的长方形划分成若干边长均为正整数,每个正方形的边均平行于矩形的相应边,试求这些正方形边之和的最小值MIN。

(如果这个长方形可以分成N个正方形,其中每个边长为Ai,那么MIN=A1+A2+^^^+AN

注意,数组A中的元素可能相等)

分析:要求正方形边长之和的最小值,切割下来的正方形应当尽可能大。又由于只要累加一个边长,最后一个切下来的正方形边长一定为gcd(a,b),那么ans=a+b-gcd(a,b) (最后一个正方形边长只算一次,a+b是两次)

注:数论的题能用int64 或者 long long的尽量用,避免内存问题。

#include<iostream>
using namespace std;
long long a,b,r,ans,a1,b1;
int main()
{
     int i;
     for(int i=1;i<=10;i++)
     {
             cin>>a1>>b1;
             r=a1%b1;
             a=b1;b=r;
             while(r!=0)
             {
                        r=a%b;
                        a=b;
                        b=r;
                        }
             ans=a; 
             cout<<a1+b1-ans<<endl;
     }
     return 0;
}             


你可能感兴趣的:(gcd)