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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值