
P2522 莫比乌斯反演
发布日期:2021-05-06 15:22:49
浏览次数:39
分类:精选文章
本文共 1274 字,大约阅读时间需要 4 分钟。
题意:
计算 。
数据范围: ,
,
。
题解:
首先可以化成二维前缀和解决这个问题。
设 。
那么 。
只要会求 就解决这个问题了。
这里用到了莫比乌斯函数的性质: 。把
换成
就行了。
感受:
int比long long快很多,最大的答案也不会爆int。
初学莫比乌斯,感觉一点也不简单,不过做了之后发现就是套路。
代码:
#includeusing namespace std ;typedef long long ll ;const int maxn = 5e4 + 5 ;int a , b , c , d , k ; bool vis[maxn] ;int prime[maxn] ;int mu[maxn] , pre_mu[maxn] ;int cnt = 0 ;void get_mu(int n){ pre_mu[1] = mu[1] = 1 ; for(int i = 2 ; i <= n ; i ++) { if(!vis[i]) prime[++ cnt] = i , mu[i] = -1 ; for(int j = 1 ; j <= cnt && prime[j] * i <= n ; j ++) { vis[prime[j] * i] = 1 ; if(i % prime[j] == 0) break ; else mu[i * prime[j]] = -mu[i] ; } pre_mu[i] = pre_mu[i - 1] + mu[i] ; }}int cal(int n , int m){ int ans = 0 ; for(int l = 1 , r ; l <= n ; l = r + 1) { r = min(n / (n / l) , m / (m / l)) ; ans += (pre_mu[r] - pre_mu[l - 1]) * (n / l) * (m / l) ; } return ans ;}int solve(int n , int m){ if(n <= 0 || m <= 0) return 0 ; if(n > m) swap(n , m) ; return cal(n / k , m / k) ;}int main(){ int t ; int n = 5e4 ; scanf("%d" , &t) ; get_mu(n) ; while(t --) { scanf("%d%d%d%d%d" , &a , &b , &c , &d , &k) ; int ans = solve(b , d) - solve(a - 1 , d) - solve(b , c - 1) + solve(a - 1 , c - 1) ; printf("%d\n" , ans) ; } return 0 ;}
发表评论
最新留言
能坚持,总会有不一样的收获!
[***.219.124.196]2025年04月12日 01时03分37秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
python-day3 for语句完整使用
2021-05-08
ButterKnife使用问题
2021-05-08
为什么讨厌所谓仿生AI的说法
2021-05-08
ORACLE 客户端工具
2021-05-08
基于LabVIEW的入门指南
2021-05-08
weblogic之cve-2015-4852
2021-05-08
Java注释
2021-05-08
C++ 函数重载
2021-05-08
.NET微信网页开发之使用微信JS-SDK调用微信扫一扫功能
2021-05-08
使用mybatis-generator生成底层
2021-05-08
Mybatis【5】-- Mybatis多种增删改查那些你会了么?
2021-05-08
计算输入的一句英文语句中单词数
2021-05-08
lvs+keepalive构建高可用集群
2021-05-08
6 个 Linux 运维典型问题
2021-05-08
取消vim打开文件全是黄色方法
2021-05-08
一个系统部署多个tomcat实例
2021-05-08
HP服务器设置iLO
2021-05-08
从头实现一个WPF条形图
2021-05-08
使用QT实现一个简单的登陆对话框(纯代码实现C++)
2021-05-08