专栏文章

题解:CF2044E Insane Problem

CF2044E题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@miptbv06
此快照首次捕获于
2025/12/03 17:36
3 个月前
此快照最后确认于
2025/12/03 17:36
3 个月前
查看原文

思路分析

看到题目,yx=kn\frac{y}{x} = k^n,我们可以使用等式的基本性质,将这个式子转换成 ykn=x\frac{y}{k^n} = x,我们就可以枚举出每个 knk^n,然后对 xxyy 进行讨论。
由题可得:
  • l1xr1l_1 \leq x \leq r_1
  • l2yr2l_2 \leq y \leq r_2
所以我们可以得出 l2knxr2kn\frac{l_2}{k^n} \leq x \leq \frac{r_2}{k^n}。所以利用我们非常一般的数学知识,其实就是求 xx 的取值范围。我们可以看下图。
我们可以发现对于每个 knk^n 来说,xx 的取值范围也就是答案就是 (l1,l2)(l_1,l_2)(l2kn,r2kn)(\frac{l_2}{k^n},\frac{r_2}{k^n}) 的交集。最后,我们将每个 knk^n 的答案给加起来就可以了。

参考代码

下面可能又来到某些人最爱的部分了。
CPP
#include<bits/stdc++.h>
#define ll long long
#define db double
using namespace std;
const int inf=2e9;
ll l1,r1,l2,r2,k;
void solve()
{
    scanf("%lld%lld%lld%lld%lld",&k,&l1,&r1,&l2,&r2);
    ll n=1,ans=0;
    while(n<=r2&&n*l1>0&&n*l1<=r2)
    {
        ll l2b,r2b;
        l2b=(l2+n-1)/n,r2b=r2/n;
        if(r2b>=l1&&r1>=l2b)
        {
            ans+=min(r2b,r1)-max(l1,l2b)+1;
        }
        
        n*=k;
    }
    printf("%lld\n",ans);
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        solve();
    }
	return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...