• Codeforces Round #553 (Div. 2) C题


    题目网址:http://codeforces.com/contest/1151/problem/C

    题目大意:给定奇数集和偶数集,现构造一个数组,先取奇数集中一个元素1,再取偶数集二个元素2,4,再取奇数集四个元素3,5,7,9,再取偶数集八个元素,6,8,10……

    得到 1,2,4,3,5,7,9,6,8,10,12……问这个数组的某一区间和是多少,并对1e9+7取模。

    题解:对于奇数集x和偶数集y的前k项,有x=k^2,y=k*(k+1),首先,计算区间和,可以用前缀和,当计算前n项的和时,只需判断前n项有多少个奇数和偶数即可,要注意取模作差的时候可能出现负数的情况。

     1 #include<bits/stdc++.h>
     2 #define ll long long
     3 using namespace std;
     4 const int mod=1e9+7;
     5 ll cal(ll x)
     6 {
     7     ll odd=0,even=0,flag=1,c=1;
     8     while(x) {
     9         if(flag==1) {
    10             odd+=min(c,x);x-=min(x,c);
    11         }
    12         else {
    13             even+=min(c,x);x-=min(x,c);
    14         }
    15         flag=-flag;c<<=1;
    16     } 
    17     ll ans=(odd%mod)*(odd%mod)%mod+(even%mod)*((even+1)%mod)%mod;
    18     return ans%mod;
    19 }
    20 int main()
    21 {
    22     ll l,r;     
    23     cin>>l>>r;
    24     cout<<(cal(r)-cal(l-1)+mod)%mod<<endl;
    25 }  
    View Code
  • 相关阅读:
    Windows提权列表
    Metasploit之多种后门生成
    Metasploit下添加新exploit
    Linux常用命令
    Drozer快速使用指南
    数值
    null, undefined 和布尔值
    数据类型概述
    JavaScript 的基本语法
    JavaScript 语言的历史
  • 原文地址:https://www.cnblogs.com/duxing201806/p/10778304.html
Copyright © 2020-2023  润新知