题目链接
比赛链接

时间限制: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

说明

6^2^=6^0^+6^0^+6^0^+6^0^+6^0^+6^0^+6^1^+6^1^+6^1^+6^1^+6^1^=36
备注:

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

#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;

}