トピックリンク
問題解決のアイデア:
全体的なアイデアはn*m
、最初から一緒にできるように変えることm*n
です。
n * m個のアイテムがあると仮定します。常にn <= mであることを保証する前提で、この時点でn = mの場合、最初にアイテムをn m個のグループに分割します(取得できるグループの最小数はn個のグループであるため)。つまり、そうでなければ、これらのn mはn nとn(mn)に変更されます。このときに考慮する必要がある問題は、本質的に(nm)* 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;
}