CodeForces 1202F(数论,整除分块)

Posted y2823774827y

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CodeForces 1202F(数论,整除分块)相关的知识,希望对你有一定的参考价值。

题目

CodeForces 1213G

做法

假设有\(P\)个完整的循环块,假设此时答案为\(K\)(实际答案可能有多种),即每块完整块长度为\(K\),则\(P=\left \lfloor \fracNK \right \rfloor\)

假设循环快中有\(p_a,p_b\)\(A\)\(B\),则

  • \(p_a\cdot P\le a\Longrightarrow p_a\le \left \lfloor \fracaP \right \rfloor\)

  • \(p_a\cdot (P+1)\ge a\Longrightarrow p_a\ge \lceil \fracaP+1 \rceil\)


\[\beginaligned\\lceil \fracaP+1 \rceil \le p_a \le \left \lfloor \fracaP \right \rfloor\\lceil \fracbP+1 \rceil \le p_b \le \left \lfloor \fracbP \right \rfloor\\endaligned\]

\(P\)可能的值可以整除分块算出来,\(O(\sqrt n)\)

Code

#include<bits/stdc++.h>
typedef int LL;
LL a,b,ans;
int main()
    scanf("%d%d",&a,&b);
    LL len(a+b);
    for(LL i=1,r;i<=len;i=r+1)
        LL P(len/i);
        r=len/P;
        if(P>a || P>b) continue;
        LL an((a+P)/(P+1)),ax(a/P),bn((b+P)/(P+1)),bx(b/P);
        if(an<=ax && bn<=bx) ans+=std::min((ax+bx),r)-std::max((an+bn),i)+1;
    
    printf("%d ",ans);
    return 0;

以上是关于CodeForces 1202F(数论,整除分块)的主要内容,如果未能解决你的问题,请参考以下文章

整除分块数论C. Floor and Mod

数论分块之整除分块

数论分块与整除相

整除分块(数论)

luogu2261余数求和题解--整除分块

[CQOI2007]余数求和-整除分块