题目链接
比赛链接

时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K Special Judge,64bit IO Format: %lld

题目描述

小y的数学作业不小心被泼上了墨水。有道题看不清了,现在他想请你帮他恢复这道题。 这道数学题原型如下:

幸运的是,小y依然记得自己所求得的答案x。现在请你帮他找回这个数列a。
你的输出需要保证0≤ai≤n

输入描述:

输入共一行两个用空格隔开的正整数n,x。含义见【题目描述】

输出描述:

输出共一行n个用空格隔开的正整数,第i个数字表示ai 当你输出多于n个数字时,只有前n个数字有效。 如果有多种答案,你只需要输出任意一种
输入保证有解。

示例1
输入

12 6

输出

2 0 0 0 0 0 0 1 1 1 1 1

说明

62=60+60+60+60+60+60+61+61+61+61+61=36
备注:

对于30%的数据满足:2≤x<n≤7
对于50%的数据满足:2≤x<n≤103
对于100%的数据满足:2≤x<n≤106
题解:
可以证出n-2=k(x-1)
最方便的构造就是:
第一个是k
后面x个是0
x-1个是1
x-1个是2
x-1个是3
直到把n个数填满
x0+…x0+x1+…x1+x2+…+x2+…
=x+ (x-1)(x1+x2+x3+…+xk)
x+(x-1)*m
等比数列求和得到m
=xk

#include<bits/stdc++.h>
typedef long long ll;
const ll mod=998244355;
const int maxn=2010;
ll a[maxn],a1[maxn],b[maxn];
using namespace std;
int n,m;
ll sum=1,ant;
int main()
{
   
	int n,x;
	cin>>n>>x;
	int w=(n-2)/(x-1);
	cout<<w<<" "<<0<<" ";
	for(int i=w-1;i>=0;i--)
	{
   
		for(int j=1;j<=x-1;j++)
		{
   
			cout<<i<<" ";
		}
	}
	return 0;
	
}