LibreOJ #528. 「LibreOJ β Round #4」求和

二次联通门 : LibreOJ #528. 「LibreOJ β Round #4」求和

 

 

 

 

 

/*
    LibreOJ #528. 「LibreOJ β Round #4」求和
    
    题目要求的是有多少对数满足他们的最大公约数的质因子不超过一个
    f (x) 表示有多少对数满足最大公约数中含有x^2这个因子
    那么f (x) = N / x ^ 2 * M * (x ^ 2)
    答案即为所有数字减去不符合要求的数字个数

    但是我们发现,可能某对数字的最大公约数含有多个质数平方因子
    那么在处理的时候就会重复筛去

    这时我们可以用容斥原理,用μ来作为容斥系数
    枚举x即可
*/
#include <cstdio>
#include <iostream>
#include <cmath>

#define Max 3231231
inline long long min (long long a, long long b) { return a < b ? a : b; }
int mu[Max | 1], is[Max | 1], p[Max | 1];
#define Mod 998244353

int Main ()
{
    long long N, M; scanf ("%lld%lld", &N, &M); register int i, j;
    int Answer = 0; int C = 0;
    int Limit = min (sqrt (N), sqrt (M));
    for (i = 2, is[1] = true, mu[1] = 1; i <= Max; ++ i)
    {
        if (!is[i]) p[++ C] = i, mu[i] = -1;
        for (j = 1; j <= C && i * p[j] <= Max; ++ j)
        {
            is[i * p[j]] = true; if (i % p[j] == 0) break;
            mu[i * p[j]] = -mu[i];    
        }
    }
    for (i = 1; i <= Limit; ++ i)
        Answer = (Answer + mu[i] * (N / (1LL * i * i) % Mod) * (M / (1LL * i * i) % Mod) % Mod + Mod) % Mod;
    printf ("%d", Answer);
    return 0;
}
int ZlycerQan = Main ();
int main (int argc, char *argv[]) {;}

 

转载于:https://www.cnblogs.com/ZlycerQan/p/7470078.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值