这应该是比较容易的一道数论题了。
枚举一些:
发现一个大事情:[1,6]+1=[7,12]
还有更多:[1,2]+1=[3,4]=[5,6]−1⋯
于是发现:ak的贡献为:k−1−∑ki=1[ai<ak]
于是,稍微变以下再模拟一下。。
long long n,m,p[100010],t;
int main()
{
n=read();
m=read();
int t=1;
while((n-t)*(n-t-1)/2>=m&&t<=n)
{
p[t]=t;
t++;
}//求可以直接上最小的 的个数
int o=m-(n-t)*(n-t-1)/2+t;//求接下来的第一个的值
p[t]=o;
int k=t-1;
fd(i,n,t+1)
{
k++;
if(k<o)
p[i]=k;
else
p[i]=k+1;
}//倒序填数
fr(i,1,n)
printf("%lld%c",p[i],i==n?'\n':' ');
return 0;
}
看来跑得还算快。。。

本文探讨了一道数论题目,通过枚举发现规律,并给出了解题思路和具体实现代码。利用数学归纳法找到数列变化的特点,进而设计算法解决该问题。
291

被折叠的 条评论
为什么被折叠?



