博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
莫比乌斯反演呓语
阅读量:5096 次
发布时间:2019-06-13

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

接下来介绍一种线性筛的做法来筛出莫比乌斯函数。 

if (i % p[j] == 0)这句话非常关键,也是为什么这个筛法是线性筛的原因。 
同样把这个程序的μ[x]μ[x] 去掉就是单纯的质数筛,同样这个质数筛由于if (i % p[j] == 0) 的存在,也是一个线性筛。

void mobius(){    int i,j; mbs[1] = 1;    fo(i,2,N)        {            if (!vis[i]) {p[++p[0]] = i; mbs[i] = -1;}            for (j = 1;j <= p[0] && i * p[j] <= N; j++)                {                    vis[i*p[j]] = 1;                    if (i % p[j] == 0) {mbs[i*p[j]] = 0; break;}                    mbs[i*p[j]] = - mbs[i];                }        }}

  

#include 
using namespace std;const int MAXN = 100000;bool check[MAXN+10];int prime[MAXN+10];int mu[MAXN+10];//求1-n,1-m内gcd=x(的倍数)的个数,修改可以改这个(大概,我还没试过)inline long long f(int n,int m,int x){ return (n/x)*(m/x);}void Moblus(){ memset(check,false,sizeof(check)); mu[1] = 1; int tot = 0; for(int i = 2; i <= MAXN; i++) { if( !check[i] ) { prime[tot++] = i; mu[i] = -1; } for(int j = 0; j < tot; j ++) { if( i * prime[j] > MAXN) break; check[i * prime[j]] = true; if( i % prime[j] == 0) { mu[i * prime[j]] = 0; break; } else { mu[i * prime[j]] = -mu[i]; } } }}int sum[MAXN+10];//找[1,n],[1,m]内互质的数的对数long long solve(int n,int m){ long long ans = 0; if(n > m)swap(n,m); for(int i = 1, la = 0; i <= n; i = la+1) { la = min(n/(n/i),m/(m/i)); ans += (long long)(sum[la] - sum[i-1])*f(n,m,i); } return ans;}int main(){ Moblus(); sum[0] = 0; for(int i = 1; i <= MAXN; i++) sum[i] = sum[i-1] + mu[i]; int a,b,c,d,k; int T; scanf("%d",&T); while(T--) { scanf("%d%d%d%d%d",&a,&b,&c,&d,&k); long long ans = solve(b/k,d/k) - solve((a-1)/k,d/k) - solve(b/k,(c-1)/k) + solve((a-1)/k,(c-1)/k); printf("%lld\n",ans); } return 0;}

 

转载于:https://www.cnblogs.com/bestefforts/p/9473771.html

你可能感兴趣的文章
【平差软件学习---科傻】 一、认识和安装科傻
查看>>
(1009) HDU 6446 Tree and Permutation(规律+树上各个点的距离和)
查看>>
应用层协议
查看>>
android 解决ScrollView嵌套ListView的问题,不能全屏,全屏不能显示下面控件
查看>>
Linux多线程实例 定时重启httpd和mysqld
查看>>
2019 Multi-University Training Contest 2 - Keen On Everything But Triangle
查看>>
centos7 中samba 开机启动命令
查看>>
对“点餐系统”的阅读、分析与运行
查看>>
Linux 安装Mysql
查看>>
给定两个有序的整形数组,找出里边的相同元素
查看>>
C语言指针加1问题以及字节对齐问题
查看>>
【NLP】揭秘马尔可夫模型神秘面纱系列文章(二)
查看>>
rest-work-eat-study-rest-work-eat or rest-rest-work-work-eat-eat..
查看>>
用EnableMenuItem不能使菜单变灰的原因
查看>>
Mac OS X Yosemite安装Hadoop 2.6记录
查看>>
Tomcat全攻略
查看>>
闰年的定义
查看>>
探索Scala(1)-- 运算符重载
查看>>
【LDAP】LDAP 中 CN, OU, DC 的含义
查看>>
Buy Tickets(线段树)
查看>>