随机跳题挑战6—P5177

文章讨论了一个编程问题,涉及使用整数幂和模运算来确定给定范围内两个数i和j,使得它们满足特定条件,即i的某个位次上的值大于j的对应位次。作者给出了详细思路和C++代码实现,展示了如何通过二进制转换和计算相关函数来解决这个问题。
摘要由CSDN通过智能技术生成

题目传送门

思维难度:蓝+

代码难度:红 

这题思维很毒,logn都过不了

题意简述:

求:

$\sum_{i=1}^n \sum_{j=1}^n i \ xor \ j \in [\min(i,j),\max(i,j)] \% 10^9+7$

思路:

对两个数i,j不妨设i>j,令h=i^j,则j最高位不能为i的最高位,否则h<j,当满足这一条件时,h一定大于j

其次,要让h<i,那只要对i取第二位,j在此取最高位,后面随便取,那么它代表的正好是该位所代表的数字

code:
#include<bits/stdc++.h>
#define int long long
using namespace std;
int q[101],n,b[101],ans,t,l;
const int mod=1000000007,inv=500000004;
inline int js(int x){
    return (((((x+1)%mod)*x)%mod)*inv)%mod;
}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    b[1]=1;
    for(int i=2;i<64;++i){ 
        b[i]=b[i-1]<<1;
        q[i]=js(((1ll<<(i-1))-1)%mod);
        q[i]=(q[i]+q[i-1])%mod;
    }
    cin>>t;
    while(t--){
        cin>>n;
        int i;
        for(i=63;i>=1;--i){ 
            if(n>b[i])break;
        }
        n-=(1ll<<(i-1));
        ans=(q[i-1]+js(n%mod))%mod*2%mod;
        cout<<ans<<"\n";
    }
    return 0;
}

求互关和三连(✪ω✪)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值