D. Divide(math)[2021 ECNU Campus Invitational Contest]

题面如下:

在这里插入图片描述

题意简说:

∏ i = l 2 r 2 % ∏ i = l 1 r 1 \prod_{i = l_2}^{r_2} \% \prod_{i = l_1}^{r_1} i=l2r2%i=l1r1 是否 等于0

思路 or 题解:

r 2 ! / ( l 2 − 1 )   ∣   r 1 ! / ( l 1 − 1 ) ! r_2! / (l_2 - 1)\ |\ r_1!/(l_1-1)! r2!/(l21)  r1!/(l11)!
等价
r 2 ! ∗ ( l 1 − 1 ) ! = = r 1 ! ∗ ( l 2 − 1 ) ! r_2!* (l_1-1)! == r_1! * (l_2 - 1)! r2!(l11)!==r1!(l21)!

判断 a ∣ b a | b ab:
只要满足: 任意一个素数 p p p a a a包含 p p p的数量 ≥ \ge b b b 包含 p p p 的数量
就可以得出 a ∣ b a | b ab

官方题解

在这里插入图片描述

我们需要用线性筛去优化我们的代码

我们需要用前缀思想和去优化我们的代码

AC代码如下:

const int maxn = 10000009;
int prime[maxn];
bool sf[maxn];
int num = 0;
int a, b, x, y;
void sushu()
{
   sf[1] = 1;
   sf[0] = 1;
   for (int i = 2; i <= maxn; i++)
   {
       if (!sf[i])
           prime[++num] = i;
       for (int j = 1; j <= num; j++)
       {
           if (i * prime[j] > maxn)
               break;
           sf[i * prime[j]] = 1;
           if (i % prime[j] == 0)
               break;
       }
   }
}
int cal(int n, int p)
{
   int res = 0;
   while (n)
   {
       res += n / p;
       n /= p;
   }
   return res;
}
void solve()
{
   cin >> a >> b >> x >> y;
   for (int i = 1; i <= num; i++)
   {
       if (cal(y, prime[i]) - cal(x - 1, prime[i]) < cal(b, prime[i]) - cal(a - 1, prime[i]))
       {
           cout << "No\n";
           return ;
       }
   }
   cout << "Yes\n";
}
int main()
{
   buff;
   sushu();
   int _;
   cin >> _;
   while (_--)
       solve();
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Joanh_Lan

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

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

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

打赏作者

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

抵扣说明:

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

余额充值