概述
链接:E-梅莉的市场经济学
- 我们发现市场每天的贸易差为1,5,9,13…
是一个首相为1,公差为4的等差数列(一开始查的区间个数,不知道当时脑子怎么想的 ^ M ^),每个区间点数的通项公式就为:1+(n-1)*4 - 这样前缀和就是Sn=n*(1+4n-3)/2=n*(4n-2)/2=n*(2n-1)=2*n^2-n
求导后4n-1,当n>1/4,就是递增的了,我们发现n是从1开始,所以这个Sn是递增的,也就是我们可以用二分来确定k所在的区间,既然k<=4e18,那么我们r就取2e9+10;这样log(n)时间复杂度也就30多,然后把要求的区间分为三个表达式来求即可。
代码
#include<bits/stdc++.h>
using namespace std;
typedef
long long ll;
ll k;
int q;
int main()
{
cin>>q;
while(q--)
{
cin>>k;
ll r=2e9+10;
ll l=1;
while(l<r)
{
ll mid=l+r+1>>1;
if(2*mid*mid-mid<=k)
{
l=mid;
}
else
{
r=mid-1;
}
}
// cout<<"L "<<l<<endl;
ll sum=2*l*l-l;
ll sub=k-sum;
ll ne=4*(l+1)-3;
ll d=ne/4;
ll ans=0;
if(sub==0)
{
cout<<0<<endl;
continue;
}
//printf("%lld %lld %lld %lldn",sum,sub,ne,d);
if(sub<=d)
{
ans=sub-1;
}
else if(sub>ne-d)
{
ans=-ne+sub;
}
else
{
ans=ne/2+1-sub;
}
printf("%lldn",ans);
}
return 0;
}
最后
以上就是留胡子小熊猫为你收集整理的P8873 [传智杯 #5 初赛] E-梅莉的市场经济学代码的全部内容,希望文章能够帮你解决P8873 [传智杯 #5 初赛] E-梅莉的市场经济学代码所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复