题目链接
解题思路:
总体思路就是将开始的n*m
转化到能凑成m*n
。
假设有n*m个物品,在总是保证n<=m前提下,先将物品分成n个m(因为能够取到的最少的组数就是n组),若此时n=m则此时即为结果,否则,就将这n个m变成n个n和n个(m-n),则此时所需要考虑的问题实质就是(n-m)*n的问题,重复上述操作直到分完物品。
AC代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std;
const int maxn = 100005;
int T,m,n,top;
int a[maxn];
int main()
{
cin>>T;
while(T--){
cin>>n>>m;
memset(a,0,sizeof(a));
top = 0;
if (n > m) swap(n,m);
while(n){
for (int i=1; i<=n; i++) a[++top] = n;
int c = m-n;
m = n;
n = c;
if (n > m) swap(n,m);
}
cout<<top<<endl;
for (int i=1; i<=top; i++) cout<<a[i]<<" ";
cout<<endl;
}
return 0;
}