ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2019-04-15 14:45:17  阅读:339  来源: 互联网

标签:Deletions Parity 运算 取模 ll 元素 奇偶性 long getXorSum


考虑差分,定义: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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有