1 条题解

  • 2
    @ 2025-10-7 1:16:05

    首先易得不可能存在gameover的情况,因为y2y^2(y+1)2(y+1)^2间共有(y+1)2y21=2y(y+1)^2-y^2-1=2y个数,是一个偶数,所以不可能存在x使得(y+1)2x=y2x|(y+1)^2-x|=|y^2-x| 然后我们分析,对于每一个y2y^2有多少个x满足y2x|y^2-x|最小,发现y2(y+1)2的中点为2y2+2y+12y^2与(y+1)^2的中点为\frac{2y^2+2y+1}{2}故在中点左侧的数是属于y的势力范围的,(y1)2y2(y-1)^2与y^2也是同理,所以我们得出了当y的势力范围为x[y2y+1,y2+y]x \in [y^2-y+1,y^2+y] 假如某一个y的势力范围完全属于[l,r]的话,那么这一个y 的贡献值就是(1)y-1i=y2y+1y2+yi=(-1)^\text{y-1}\sum_{i=y^2-y+1}^{y^2+y}i=(1)y-14y3+2y2(-1)^\text{y-1}\frac{4y^3+2y}{2},然后易得有且仅有一段最长的y[L,R]y \in [L,R]使得其中的y的势力范围属于[l,r][l,r],其贡献为i=LR(1)i-14i3+2i2\sum_{i=L}^{R}(-1)^\text{i-1}\frac{4i^3+2i}{2}因为这一坨式子太操蛋了,所以我们用一个前缀数组Sn=i=1n(1)i-14i3+2i2S_n=\sum_{i=1}^{n}(-1)^\text{i-1}\frac{4i^3+2i}{2}来表示,化简得Sn=n(n+1)(2n+1)2(1)n-1S_n=\frac{n*(n+1)*(2n+1)}{2}(-1)^\text{n-1},最后这一段y的贡献值就为SRSL -1S_R-S_\text{L -1},最后只要加上左边和右边2段不完全包括的贡献值([l,(L1)2+(L1)][l,(L-1)^2+(L-1)][(R+1)2(R+1)+1,r][(R+1)^2-(R+1)+1,r],还是用等差数列求和公式)就结束了

    #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
    上传者