题意:
给你四个整数n,k,b,s 让你构造一个长度为n的数组a,和为s,并且所有的的和为b.
如果构造不出就输出-1
思路:
首先找无法构造的情况:
(最小值)s只放在一个位置的值都不能大于等于b,即.
(最大值)n-1个位置全部放k-1,并且剩下的位置放b*k时,s依然大于这个值,即
那么只要在这个范围内的值的s都可以构成。
然后就是构造,可以先构造一个sum=k*b最为最低值,然后每次判断一下是否s-(k-1)>=sum
如果是就说明给k-1最后一个位置也有最少k*b满足条件的情况,否则构造0。
最后直接输出s表示剩下的元素的值即可。
#include<cstdio>
#include <iostream>
#include <algorithm>
#include <string.h>
#include <string>
#include <math.h>
#include<vector>
#include<queue>
#include<map>
#define sc_int(x) scanf("%d", &x)
#define sc_ll(x) scanf("%lld", &x)
#define pr_ll(x) printf("%lld", x)
#define pr_ll_n(x) printf("%lld\n", x)
#define pr_int_n(x) printf("%d\n", x)
#define ll long long
using namespace std;
const int N=1000000+100;
int n ,m,h;
int s[N];
int main()
{
int t;
sc_int(t);
while(t--)
{
ll n,k,b,s;
cin>>n>>k>>b>>s;
if(s/k<b||(ll)b*k+n*(k-1)<s)cout<<"-1\n";
else{
ll sum=k*b;
for(int i =1;i<n;i++)
{
if(s-(k-1)>=sum){cout<<k-1<<" ";s-=(k-1);}
else cout<<0<<" ";
}
cout<<s<<endl;
}
}
return 0;
}