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