牛客OI周赛15-提高组B题
恢复数列
https://ac.nowcoder.com/acm/contest/4912/B
仅对官方题解一个比较(通俗??)的理解
题解:当时有解
证明:显然,求得序列中中,若给其从小到大排个序,那么前个数必然是相同的,则有
那么如果对于给定的有解的话,必然使得 有解,其实就是把()这组合法序列的替换成就是新的合法序列了。
那么可以递归下去,都是合法序列。
显然 &&时无解,所以递减到最后只能是;
即有 解得,即
得证。
构造办法,从上述可知,,那么构造办法就可以为第一个为,接下来x个0,接下来x-1个为1,x-1个为2...
代码
#include<bits/stdc++.h> #define ll long long #define endl '\n' #define rep(i,l,r) for(int i=l;i<=r;i++) #define per(i,r,l) for(int i=r;i>=l;i--) using namespace std; int main() { ios::sync_with_stdio(0),cin.tie(0); int n,x; cin>>n>>x; int t=(n-x-1)/(x-1)+1; cout<<t<<" "; for(int i=1;i<=x;i++) cout<<0<<" "; int res=1; for(int i=1;i<=n-x-1;i++) { if(i%(x-1)==0)cout<<res++<<" "; else cout<<res<<" "; } cout<<endl; }