1 条题解
-
0
自动搬运
来自洛谷,原作者为

Eric1031
**搬运于
2025-08-24 22:07:56,当前版本为作者最后更新于2019-01-07 20:59:04,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
对大佬的代码表示无限懵逼……
这道题目思维有点毒瘤,因为logn都会超时,从头讲吧。
对两个数i,j不妨设i>j,令h=i^j,则j最高位不能为i的最高位,否则h<j,当满足这一条件时,h一定大于j,其次,要让h<i,那么(经过多次尝试)只要对i第二1处,j在此取最高位,后面随便取,我们神奇地发现,它代表的正好是该位代表的数字,同理对第3,第4……
于是,一个数代表的就是它减去最高位!
然后,就好办了……
#include<bits/stdc++.h> using namespace std; long long q[101],n,b[101],sum,bit; int t,l; const long long mod=1000000007,inv=500000004; long long num(long long x) { long long h=(((((x+1)%mod)*x)%mod)*inv)%mod; return h; }//等差数列求和 int main() { b[1]=1; for(int i=2;i<64;i++) { b[i]=b[i-1]<<1; q[i]=num(((1ll<<(i-1))-1)%mod); q[i]=(q[i]+q[i-1])%mod;//求2^i的情况数 } scanf("%d",&t); while(t--) { scanf("%lld",&n); for(bit=63;bit>=1;bit--) { if(n>b[bit])break; }//倒着求,不然会T n-=(1ll<<(bit-1)); sum=q[bit-1]; sum=(sum+num(n%mod))%mod; sum=(sum*2)%mod; printf("%lld\n",sum); } }
- 1
信息
- ID
- 4123
- 时间
- 1000ms
- 内存
- 16MiB
- 难度
- 5
- 标签
- (无)
- 递交数
- 0
- 已通过
- 0
- 上传者