博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【bzoj2820】YY的GCD 莫比乌斯反演
阅读量:4645 次
发布时间:2019-06-09

本文共 1311 字,大约阅读时间需要 4 分钟。

题目描述

神犇YY虐完数论后给傻×kAc出了一题给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的(x, y)有多少对kAc这种
傻×必然不会了,于是向你来请教……多组输入

输入

第一行一个整数T 表述数据组数接下来T行,每行两个正整数,表示N, M

输出

T行,每行一个整数表示第i组数据的结果

样例输入

2

10 10
100 100

样例输出

30

2791


题解

莫比乌斯反演

设后面的sigma中的式子为f(k),那么可以在筛完素数和mu之后处理出f(i),根据粗略素数个数和调和级数,时间复杂度大约是O(n)的。

于是转变为求

然后再求f(i)的前缀和,然后分块处理即可。

#include 
#include
using namespace std;const int n = 10000000;int mu[n + 10] , prime[n + 10] , tot;long long f[n + 10] , sum[n + 10];bool np[n + 10];long long cal(int a , int b){ int i , last; long long ans = 0; for(i = 1 ; i <= a && i <= b ; i = last + 1) last = min(a / (a / i) , b / (b / i)) , ans += (sum[last] - sum[i - 1]) * (a / i) * (b / i); return ans;}int main(){ int i , j , T , a , b; mu[1] = 1; for(i = 2 ; i <= n ; i ++ ) { if(!np[i]) mu[i] = -1 , prime[++tot] = i; for(j = 1 ; j <= tot && i * prime[j] <= n ; j ++ ) { np[i * prime[j]] = 1; if(i % prime[j] == 0) { mu[i * prime[j]] = 0; break; } else mu[i * prime[j]] = -mu[i]; } } for(i = 1 ; i <= tot ; i ++ ) for(j = 1 ; j * prime[i] <= n ; j ++ ) f[j * prime[i]] += mu[j]; for(i = 1 ; i <= n ; i ++ ) sum[i] = sum[i - 1] + f[i]; scanf("%d" , &T); while(T -- ) scanf("%d%d" , &a , &b) , printf("%lld\n" , cal(a , b)); return 0;}

 

转载于:https://www.cnblogs.com/GXZlegend/p/6999615.html

你可能感兴趣的文章
C语言配置文件库iniparser
查看>>
sql STUFF用法
查看>>
1-1 用Python爬取豆瓣及IMDB上的电影信息
查看>>
关于解决session过期跳转到登陆页面并跳出iframe框架
查看>>
老黄历:编码式的统治策略
查看>>
HTML5 标准规范完成了
查看>>
使用Jenkins进行Android自动打包,自定义版本号等信息【转】
查看>>
[NOIP 2016普及组 No.1] 买铅笔
查看>>
单例模式(Singleton Pattern)
查看>>
由数字与字母组成的验证码的实现
查看>>
ResultSet自动关闭问题
查看>>
mvc 部分视图
查看>>
BZOJ3261: 最大异或和
查看>>
全端开发必备!10个最好的 Node.js MVC 框架
查看>>
Fabric远程自动化使用说明
查看>>
linux php命令安装
查看>>
热身赛应该做什么?
查看>>
动手实现读写锁
查看>>
HNOI2010 合唱队
查看>>
或、异或
查看>>