1 条题解
-
2
首先易得不可能存在gameover的情况,因为到间共有个数,是一个偶数,所以不可能存在x使得 然后我们分析,对于每一个有多少个x满足最小,发现故在中点左侧的数是属于y的势力范围的,也是同理,所以我们得出了当y的势力范围为 假如某一个y的势力范围完全属于[l,r]的话,那么这一个y 的贡献值就是,然后易得有且仅有一段最长的使得其中的y的势力范围属于,其贡献为因为这一坨式子太操蛋了,所以我们用一个前缀数组来表示,化简得,最后这一段y的贡献值就为,最后只要加上左边和右边2段不完全包括的贡献值(和,还是用等差数列求和公式)就结束了
#include<bits/stdc++.h> using namespace std; #define ll long long const int mod=1e9+7; ll qmi(ll a,ll b){ ll ans=1; while(b){ if(b&1)ans=ans*a%mod; a=a*a%mod,b>>=1; } return ans; } ll flag[]={-1,1}; ll sum(ll x){ return (mod+x*(x+1)%mod*(2*x+1)%mod*qmi(2,mod-2)%mod*flag[x&1])%mod; } ll tot(ll l,ll r){ if(l>r)return 0; return (l+r)%mod*((r-l+1)%mod)%mod*qmi(2,mod-2)%mod; } ll l,r; int main(){ scanf("%lld%lld",&l,&r); //Çó³öÒ»¶ÎÁ¬ÐøµÄyµÄ×óÓұ߽磬ʹÆäÖеÄyµÄÊÆÁ¦·¶Î§ÊôÓÚl~r ll L=sqrt(l),R=sqrt(r); while(L*L-L<l-1)L++; while(R*R+R>r)R--; ll ans=(mod+sum(R)-sum(L-1))%mod; //Çó²»ÍêÈ«°üº¬µÄ¹±Ï× ans=(ans+flag[(L-1)&1]*tot(l,(L-1)*(L-1)+L-1)%mod+mod)%mod; ans=(ans+flag[(R+1)&1]*tot((R+1)*(R+1)-R,r)%mod+mod)%mod; printf("%lld\n",ans); return 0; }
- 1
信息
- ID
- 268
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 9
- 标签
- (无)
- 递交数
- 33
- 已通过
- 4
- 上传者