1 条题解

  • -1
    @ 2025-10-7 1:21:14

    首先我们打表发现2i((mod3))2^i(\pmod3)具有周期性,在2,1,2,1间来回变动,具体为

    $$2^i(\pmod 3)= \begin{cases} 2 & i为奇数\\ 1 & i为偶数 \end{cases} $$

    所以第ii场比赛的贡献值wiw_i也能够根据奇偶性表达出来

    $$w_i= \begin{cases} \frac{2^i-2}{3} & i为奇数\\ \frac{2^i-1}{3} & i为偶数 \end{cases} $$

    然后我们对这一坨式子做一个前缀和SnS_n,那么有人问了:主播主播,SnS_n怎么求,很简单,先求nn为偶数的情况

    $$S_n=\sum_{i=1}^{\frac{n}{2}}(w_\text{2i-1}+w_\text{2i}) =\sum_{i=1}^{\frac{n}{2}}(2^\text{2i-1}-1)=\frac{2}{3}(2^n-1)-\frac{n}{2}\text{(PS:主播懒得写过程,自己推去,不会去问数学老师)} $$

    nn为奇数呢,Sn=Sn-1+wnS_n=S_\text{n-1}+w_n秒了,最后答案等于SrSl-1S_r-S_\text{l-1}

    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long
    const ll 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 get(ll n){
    	if(n&1){
    		return (get(n-1)+(qmi(2,n)-2+mod)%mod*qmi(3,mod-2)%mod)%mod;
    	}
    	return (2*qmi(2,n)%mod*qmi(3,mod-2)%mod-2*qmi(3,mod-2)%mod-n%mod*qmi(2,mod-2)%mod+mod+mod)%mod;
    }
    int main(){
    	ll l,r;
    	scanf("%lld%lld",&l,&r);
    	printf("%lld\n",(get(r)-get(l-1)+mod)%mod);
    	return 0;
    }
    
    
    • 1

    信息

    ID
    276
    时间
    1000ms
    内存
    512MiB
    难度
    9
    标签
    (无)
    递交数
    37
    已通过
    4
    上传者