题解 P7281

· · 题解

题目传送门

Description

给定两组正整数 \{a,a+1,\cdots,b\}\{c,c+1,\cdots,d\}。判断 c·(c+1)\cdots d 能否被 a·(a+1)\cdots b 整除。

Analyse

为了描述方便,令 x=a·(a+1)\cdots by=c·(c+1)\cdots d

对于整除类的题目,容易想到当 x\%y=0 时,对于每个在 y 中出现的质因数 p 必在 x 中出现,且在 x 中出现次数更多。那么我们可以对 xy 进行分解质因数,然后计算质因数 p 出现次数并比较。

对于本题,由于 x 为多数相乘,且范围较大,考虑通过计算出质因子 pb! 中出现的次数和在 a-1 中出现的次数。那么将两者相减就是 px 中出现的次数。为了方便枚举质因子,这里用欧拉筛法将所有质数线性筛出。

Pay~attention

注意到 n! 中质因子 p 的数量等于 1\sim np 的数量和。

证明:(摘自 网络)

1\sim n 中,p 的倍数,即至少包含 1 个质因子 p 的有 \lfloor \frac{n}{p} \rfloor 个。

p^2 的倍数,即至少包含 2 个质因子 p 的有 \lfloor \frac{n}{p^2}\rfloor 个。但其中至少包含 1 个质因子已经在 \lfloor \frac{n}{p} \rfloor 里统计过,所以只需要再统计第 2 个质因子,即累加上 \lfloor \frac{n}{p^2}\rfloor,而不是 2 \times \lfloor \frac{n}{p^2}\rfloor

综上所述,n ! 中质因子 p 的个数为:

\lfloor \frac{n}{p}\rfloor+\lfloor \frac{n}{p^2}\rfloor+\lfloor \frac{n}{p^3}\rfloor+\lfloor \frac{n}{p^{\lfloor{\log_p} n\rfloor}}\rfloor=\sum\limits_{p^k\le n}{\lfloor \frac{n}{p^k}\rfloor} Solution

欧拉筛法部分是板子,此处就不放了。

计算质因子出现次数部分如下:

int count(int x,int a)
{
    int sum=0;
    while(x)
    {
        sum+=x/a;
        x/=a;
    }
    return sum;
}

判断整除部分如下:

for(int i=1;i<=cnt&&pri[i]<=b;i++)
{
    int a_b=count(b,pri[i])-count(a-1,pri[i]);
    int c_d=count(d,pri[i])-count(c-1,pri[i]);
    if(a_b>c_d)
    {
        sol=false;
        break;
    }
}
The~end

客官看完别忘了点个赞哦~