题目链接
比赛链接
时间限制: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;}