• 【题解】CF1485C Floor and Mod(二分答案,整除分块)


    【题解】CF1485C Floor and Mod

    emmm……NOIP 考前两周,跟 CSP 考前一样(虽然最后并没有去考),写篇题解增加以下 RP(雾)。

    提供一篇思路大体和题解区相同但用了二分写法的题解。

    题目链接

    CF1485C Floor and Mod

    题意概述

    1ax,1by" role="presentation">1ax,1byab=amodb" role="presentation">ab=amodb(a,b)" role="presentation">(a,b) 个数。

    数据范围

    • 1x,y109" role="presentation">1x,y109

    思路分析

    首先我们设 ab=k" role="presentation">ab=k,则:a=bk+k=k(b+1)" role="presentation">a=bk+k=k(b+1)。也就是说 a" role="presentation">ab+1" role="presentation">b+1 的倍数。

    那么题意转化为:

    [1,x]" role="presentation">[1,x] 里找一个 a" role="presentation">a,在 [1,y]" role="presentation">[1,y] 里找一个 b" role="presentation">b,满足 a" role="presentation">ab+1" role="presentation">b+1 的倍数,问有多少对这样的 (a,b)" role="presentation">(a,b)

    那么我们考虑对于 [1,y]" role="presentation">[1,y] 里的每一个 b" role="presentation">b[1,x]" role="presentation">[1,x] 中有多少个 a" role="presentation">a 满足题意。其实就相当于问 [1,x]" role="presentation">[1,x] 中有多少个 b+1" role="presentation">b+1 的倍数,显然有 xb+1" role="presentation">xb+1 个。

    那么总的答案就为

    i=1yxi+1=i=2y+1xi" role="presentation">i=1yxi+1=i=2y+1xi

    那么可以直接整除分块解决。

    结果我写完发现样例都过不了。。所以显然是有问题的。

    我们发现 b" role="presentation">b 首先不能为 1" role="presentation">1,因为任何数是 1" role="presentation">1 的倍数,而任何数除以 1" role="presentation">1 不可能为 0" role="presentation">0

    所以我们的下界应该从 3" role="presentation">3 开始。

    其次,在 a=bk+k=k(b+1)" role="presentation">a=bk+k=k(b+1) 中,我们忽略了一个重要条件,k" role="presentation">k 在这里相当于 amodb" role="presentation">amodb,是余数,而余数不能大于等于除数,即 k<b" role="presentation">k<b

    所以对于 [3,y]" role="presentation">[3,y] 的每一个 b" role="presentation">b,其实只有 ab+1<b" role="presentation">ab+1<ba" role="presentation">a 才满足题意。

    那么这样的 a" role="presentation">a[1,x]" role="presentation">[1,x] 中有 min(b+1)(b1),xb+1" role="presentation">min(b+1)(b1),xb+1 个。

    那么整个答案就为:

    i=2ymin((i+1)(i1),x)i+1=i=3y+1min(i(i2),x)i=i=3lim(i2)+i=lim+1y+1xi=(1+lim2)×(lim3+1)2+i=lim+1y+1xi" role="presentation">i=2ymin((i+1)(i1),x)i+1=i=3y+1min(i(i2),x)i=i=3lim(i2)+i=lim+1y+1xi=(1+lim2)×(lim3+1)2+i=lim+1y+1xi

    其中 lim" role="presentation">lim 表示的是使得 i×(i2)x" role="presentation">i×(i2)x 的最后一个 i" role="presentation">i

    那么 lim" role="presentation">lim 直接枚举/解不等式/二分都可,我这里采用的是二分。

    最后的式子中,第一项显然可以 O(1)" role="presentation">O(1) 求出,第二项显然可以整除分块,于是整道题成功解决。

    时间复杂度:O(T(logy+y))" role="presentation">O(T(logy+y))

    易错点

    没啥细节,只是需要开 long long。

    代码实现

    1. //CF1485C
    2. #include
    3. #include
    4. #include
    5. #define int long long
    6. using namespace std;
    7. inline int read()
    8. {
    9. int x=0,f=1;char ch=getchar();
    10. while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    11. while(ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
    12. return x*f;
    13. }
    14. int work(int n,int k,int lim)
    15. {
    16. int ret=0;
    17. for(int l=lim,r;l<=n;l=r+1)
    18. {
    19. if(k/l==0)break;
    20. r=min(k/(k/l),n);
    21. ret+=(k/l)*(r-l+1);
    22. }
    23. return ret;
    24. }
    25. signed main()
    26. {
    27. int T;
    28. T=read();
    29. while(T--)
    30. {
    31. int x,y;
    32. x=read();y=read();
    33. int now=0;
    34. for(int step=(1ll<<30);step>=1;step>>=1)
    35. {
    36. if(now+step<=(y+1)&&(now+step)*(now+step-2)<=x)now+=step;
    37. }
    38. int lim=now;
    39. cout<<(lim-2)*(lim-1)/2+work(y+1,x,lim+1)<<'\n';
    40. }
    41. }
  • 相关阅读:
    swig教程-指令文件《一》
    2018 国际AIOps挑战赛单指标数据集分析
    DevEco Studio harmonyOS 模拟器 Unable to install HAXM
    python基于Vue的web信息收集程序设计
    DCloud之APP离线SDK升级步骤(3.5.3升至最新版3.6.7.81556_20221018)
    im即时通讯系统源码/如何搭建一个自己的im即时通讯呢?
    matlab命令行窗口结果显示不全,解析式太长,输出不完整解决办法
    python配置到系统环境中
    LeetCode-790. 多米诺和托米诺平铺【动态规划,矩阵快速幂】
    李沐:用随机梯度下降来优化人生!
  • 原文地址:https://blog.csdn.net/m0_46222454/article/details/127812975