其他分享
首页 > 其他分享> > CF Parity Alternated Deletions(排序+奇偶性)

CF Parity Alternated Deletions(排序+奇偶性)

作者:互联网

考虑差分,定义:ll getXorSum(ll x)函数,求[1,x]上元素取模运算的和。最后答案即为:getXorSum(b)-getXorSum(a)

设计getXorSum函数,易看出以下性质:
1.对于属于区间[l,r)的元素i,i进行取模运算的值必为0;
2.对于[l,r)左边的元素i,取模运算的值为i;
3.对于[l,r)右边的元素i,通过imod(r-1),将其映射到[1,r-1]区间上(若imod(r-1)≡0 视作将i映射到r-1位置),那么取模运算的值可以划归为①、②中的一种

分类讨论:

①: x<l, ans=$\sum_{i=1}^{x}i$

②: x>=l&&x<r, ans=$\sum_{i=1}^{l-1}i$

③: x>=r, ans=$(\frac{x}{r-1})\times\sum_{i=1}^{l-1}i +\sum_{i=1}^{min(xmod(r-1),l-1)}i$

另外记得开ll,不开ll见祖宗。

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
ll a, b, l, r;

ll getSum(ll x)  {return x*(x+1)>>1;}

ll getXorSum(ll x)
{
    if(x<l) return getSum(x);
    else if(x<r) return getSum(l-1);
    return getSum(l-1)*(x/(r-1))+getSum(min(x%(r-1),l-1));
    //一步写也是可以的
    //return getSum(l-1)*(x/(r-1))+getSum(min(x%(r-1),l-1));
}

int main()
{
    while(cin>>a>>b>>l>>r){
        cout<<getXorSum(b)-getXorSum(a)<<endl;
    }
    return 0;
}
/*

 

标签:Deletions,Parity,运算,取模,ll,元素,奇偶性,long,getXorSum
来源: https://www.cnblogs.com/ChenyangXu/p/10710445.html