我是靠谱客的博主 留胡子小熊猫,这篇文章主要介绍P8873 [传智杯 #5 初赛] E-梅莉的市场经济学代码,现在分享给大家,希望可以做个参考。

链接: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多,然后把要求的区间分为三个表达式来求即可。

代码


复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#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内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(61)

评论列表共有 0 条评论

立即
投稿
返回
顶部