2020牛客暑期多校训练营(第七场)B-Mask Allocation

2020牛客暑期多校训练营(第七场)B-Mask Allocation

题目大意:有n个重症医院,m个轻症医院,n*m个口罩,分成k份(每份均不可分开),使得若发给n个医院,每个医院可以刚好分到m个;若发给m个医院,每个医院可以刚好分到n个,求最小的k,以及这k个数的字典序最大的排列 


题目思路:构造一个序列,首先发现,若n、m gcd不为1,结果应该是n/gcd(n,m),m/gcd(n,m)的结果,元素乘2,长度乘2;
求到n=n/gcd(n,m),m=m/gcd(n,m);
构造方法为,保证每次n>m,每次输出m个m,n-=m;当m==1时,输出n个1,结束
设x=gcd(n,m);那么所求数列每次结果应为m*x个m*x,当m==1时,应该是n*x个m*x;

样例输入:

2
5 4
3 3

 样例输出:

8
4 4 4 4 1 1 1 1
3
3 3 3

样例解释:

对于5 4:20个口罩,分给5家医院,可以选4家医院分别选取1-4背包,剩下一家选取5-8背包,每家4个口罩;分给4家医院,每家医院选一个4一个1,每家医院5个口罩。

对于3 3:9个口罩,分给3家医院,每家3个。 

/*** 
题目来源:2020牛客暑期多校训练营(第七场)B-Mask Allocation
题目链接:https://ac.nowcoder.com/acm/contest/5672/B
题目类型:构造
题目大意:有n个重症医院,m个轻症医院,n*m个口罩,分成k份(每份均不可分开),使得若发给n个医院,每个医院可以刚好分到m个;若发给m个医院,每个医院可以刚好分到n个,求最小的k,以及这k个数的字典序最大的排列 
题目思路:构造一个序列,首先发现,若n、m gcd不为1,结果应该是n/gcd(n,m),m/gcd(n,m)的结果,元素乘2,长度乘2;
求到n=n/gcd(n,m),m=m/gcd(n,m);
构造方法为,保证每次n>m,每次输出m个m,n-=m;当m==1时,输出n个1,结束
设x=gcd(n,m);那么所求数列每次结果应为m*x个m*x,当m==1时,应该是n*x个m*x; 
****/ 
#include
using namespace std;
#define ll long long

int ans[10000005];
int main()
{
	int t;scanf("%d",&t);
	while(t--){
		int n,m,cnt=0;
		scanf("%d%d",&n,&m);
		int x=__gcd(n,m);//求gcd 
		n/=x;m/=x;
		while(true){
			if(n

 

你可能感兴趣的:(训练赛题目解题报告)