Codeforces Round 907 (Div. 2)D. Suspicious logarithms

题目:思路:根据这个表可以看出,f不会超过63,g不会超过f,所以g和f的数据范围特别小,我们可以尝试枚举f;然后求每一段f的值都相同的g的和,也就是4-7,8-15,16-31。。。。。。注意边界。

之后我们开始求x=cl-cr,f=i的g的和。

代码:

#include<bits/stdc++.h>
using namespace std;
__int128 mod=1000000007;
__int128 solve(__int128 l,__int128 r,__int128 d){
	__int128 cl,cr,lx,rx,cw,ans;
	lx=1;
	rx=d-1;
	cw=0;
	ans=0;
	while(lx<=r)
	{
		cl=max(l,lx);
		cr=min(r,rx);
		if(cl<=cr)ans=(ans+(cr-cl+1)*cw)%mod;
		lx=lx*d;
		rx=rx*d+d-1;
		cw++;
	}
	return ans;
}
int main(){
	ios::sync_with_stdio(false),cin.tie(0);
	int T;
	long long x,y;
	__int128 l,r,cl,cr,lx,rx,ans,i;
	for(cin>>T;T>0;T--)
	{
		cin>>x>>y;
		l=x;
		r=y;
		lx=4;
		rx=7;
		ans=0;
		for(i=2;i<=60;i++)
		{
			cl=max(l,lx);
			cr=min(r,rx);
			if(cl<=cr)ans=(ans+solve(cl,cr,i))%mod;
			lx*=2;
			rx=rx*2+1;
		}
		cout<<(long long)ans<<'\n';
	}
	return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

临江浪怀柔ℳ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值