题目描述

FGD正在破解一段密码,他需要回答很多类似的问题:对于给定的整数a,b和d,有多少正整数对x,y,满足x<=a,y<=b,并且gcd(x,y)=d。作为FGD的同学,FGD希望得到你的帮助。

分析

很明显的一道莫比乌斯反演,但是还没有写过学习笔记,之后一定补起来(flag)。

\[f(k)=\sum^a_{i=1}\sum^b_{j=1}[gcd(i,j)=k]\]
\[F(k) = \sum_{n|k}f(k)= \lfloor \frac{a}{n} \rfloor \lfloor \frac{b}{n} \rfloor \]
由反演退出以下的式子:
\[f(n) = \sum_{n|k} \mu (\lfloor \frac{k}{n}\rfloor) F(k)\]
那么答案就是\(f(d)\),
我们枚举整除分块$\lfloor \frac k d \rfloor $
递推式就是:
\[ans=\sum^{min(a,b)}_{t=1} \mu(t) \lfloor \frac{a}{td} \rfloor \lfloor \frac{b}{td} \rfloor \]
多组数据我们就用整除分块,差不多复杂度是\(O(t\sqrt{n})\)
ps.记得要开long long。

ac代码

#include <bits/stdc++.h>
#define ll long long
#define ms(a, b) memset(a, b, sizeof(a))
#define inf 0x3f3f3f3f
using namespace std;
template <typename T>
inline void read(T &x) {
    x = 0; T fl = 1;
    char ch = 0;
    while (ch < '0' || ch > '9') {
        if (ch == '-') fl = -1;
        ch = getchar();
    }
    while (ch >= '0' && ch <= '9') {
        x = (x << 1) + (x << 3) + (ch ^ 48);
        ch = getchar();
    }
    x *= fl;
}
#define N 500005
ll sum[N], mui[N], prime[N];
int cnt;
bool vis[N];
void get_mui(ll MAXN) {
    mui[1] = 1;
    for (ll i = 2; i <= MAXN; i ++) {
        if (!vis[i]) {
            mui[i] = -1;
            prime[++ cnt] = i;
        }
        for (ll j = 1; j <= cnt && prime[j] * i <= MAXN; j ++) {
            vis[prime[j] * i] = 1;
            if (i % prime[j] == 0) break;
            else mui[prime[j] * i] = -mui[i];
        }
    }
    for (ll i = 1; i <= MAXN; i ++) sum[i] = sum[i - 1] + mui[i];
}
int main() {
    int cas;
    read(cas);
    get_mui(500000);
    while (cas --) {
        ll a, b, d;
        read(a); read(b); read(d);
        ll ans = 0;
        for (ll l = 1, r; l <= min(a, b); l = r + 1) {
            r = min(a / (a / l), b / (b / l));
            ans += (a / (l * d) * (b / (l * d))) * (sum[r] - sum[l - 1]);
        }
        printf("%lld\n", ans);
    }
    return 0;
}

最新文章

  1. Spring学习总结(二)——静态代理、JDK与CGLIB动态代理、AOP+IoC
  2. 负载均衡下的资源文件配置/多站点下的资源文件夹共享(Windows IIS)
  3. discuzX3后台管理插件开发入门
  4. 专题:Channel Bonding/bonding
  5. U盘文件后缀变成.exe怎么办?
  6. App交互demo
  7. 调用webservice查询手机号码归属地信息
  8. 假防病毒软件从电脑移植到了 Android 平台
  9. 问题记录2:TypeError: write() argument must be str, not bytes
  10. Python 最大公约数的欧几里得算法及Stein算法
  11. flume集群日志收集
  12. Rectangles hdu2461容斥定理
  13. [Python]多个装饰器合并
  14. 《图解HTTP》读书笔记(五:HTTP报文结构)
  15. loj.ac:#10024. 「一本通 1.3 练习 3」质数方阵
  16. mysql修改用户密码命令
  17. nginx请求数据超长的问题解决
  18. helm的安装于与简单使用
  19. 【CTF WEB】命令执行
  20. 浅谈c++中map插入数据的用法

热门文章

  1. 你要的fpga&amp;数字前端笔面试题都在这儿了
  2. SA的一个辣鸡trick
  3. JSP页面&lt;%@ ...%&gt;是什么意思?
  4. Quartz_简单使用
  5. Runaway argument错误 [Overleaf: 在线Latex] [Type 3问题后续]
  6. HTTP协议冷知识大全
  7. Codeforces Round #505 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final)-C. Plasticine zebra
  8. Codeforces Round #504 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final)-C-Bracket Subsequence
  9. 实验二Java面向对象程序设计_20135129李畅宇
  10. 《Linux内核设计与实现》 第十八章学习笔记