hdu6576--模拟

题意:n个仓库,m个工人,给出每个仓库的任务量,将m个工人分配,要求所有仓库的任务量与工人数的乘积相等,问有没有一种分配方式满足要求,且将所有工人都派出去

思路:分配的工人数是仓库任务量比值的倒数,即若有三个仓库,任务量比值为a: b :c,那么工人数应该是1/a:1/b:1/c , 然后把这个比值化成整数,然后这个符合要求的所有工人数加起来,看是不是m的因子,如果是就可以,否则不行

#include <cstdio>
#include <algorithm>
#include <iostream>
using namespace std;
typedef long long ll;
const int N = 1010;
ll n,m;
ll a[N],ans[N];
ll sum;
ll lcaa;
ll lca(ll a,ll b){
	return a/__gcd(a,b)*b;
}
int main(){
	while(~scanf("%lld%lld",&n,&m)){
		sum = 0,lcaa = 1;
		for(int i = 1;i <= n;i++){
			scanf("%lld",a+i);
			lcaa = lca(lcaa,a[i]);
		}
		for(int i = 1;i <= n;i++){
			ans[i] = lcaa/a[i];
			sum+=ans[i];
		}
		if(m%sum) puts("No");
		else{
			puts("Yes");
			ll k = m/sum;
			printf("%lld",ans[1]*k);
			for(int i = 2;i <= n;i++){
				printf(" %lld",ans[i]*k);
			}
			puts("");
		}
	}	
	return 0;
}
发布了27 篇原创文章 · 获赞 0 · 访问量 333

猜你喜欢

转载自blog.csdn.net/weixin_44083561/article/details/104468066