Mobius 反演
上次看莫比乌斯繁衍反演是一个月前,讲道理没怎么看懂..
//HAOI 2011 B //by Cydiater //2016.7.25 #include <iostream> #include <cstring> #include <string> #include <algorithm> #include <cstdio> #include <cstdlib> #include <ctime> #include <cmath> #include <iomanip> #include <string> #include <queue> #include <map> using namespace std; #define ll long long #define up(i,j,n) for(int i=j;i<=n;i++) #define down(i,j,n) for(int i=j;i>=n;i--) #define FILE "b" ; const int oo=0x3f3f3f3f; inline int read(){ ,f=; ;ch=getchar();} +ch-';ch=getchar();} return x*f; } ,T,a,b,c,d,sum[MAXN],k; bool vis[MAXN]; namespace solution{ void make_mu(){ mu[]=; memset(vis,,sizeof(vis)); up(i,,){ ;} ;prime[j]*i<=&&j<=cnt;j++){ vis[prime[j]*i]=; )mu[i*prime[j]]=-mu[i]; else{ mu[i*prime[j]]=; break; } } } up(i,,)sum[i]=sum[i-]+mu[i]; } int get(int n,int m){ if(n>m)swap(n,m); ; ;i<=n;i=pos+){ pos=min(n/(n/i),m/(m/i)); ans+=(sum[pos]-sum[i-])*(n/i)*(m/i); } return ans; } } int main(){ //freopen("input.in","r",stdin); freopen(FILE".in","r",stdin); freopen(FILE".out","w",stdout); T=read(); using namespace solution; memset(sum,,sizeof(sum)); make_mu(); while(T--){ a=read();b=read();c=read();d=read();k=read(); a--;c--; a/=k;b/=k;c/=k;d/=k; printf("%d\n",get(b,d)-get(a,d)-get(b,c)+get(a,c)); } ; }
BZOJ 1101
//BZOJ 1101 //by Cydiater //2016.7.25 #include <iostream> #include <cstdio> #include <cstring> #include <string> #include <algorithm> #include <ctime> #include <cmath> #include <cstdlib> #include <queue> #include <map> #include <iomanip> using namespace std; #define ll long long #define up(i,j,n) for(int i=j;i<=n;i++) #define down(i,j,n) for(int i=j;i>=n;i--) ; const int oo=0x3f3f3f3f; inline int read(){ ,f=; ;ch=getchar();} +ch-';ch=getchar();} return x*f; } ,sum[MAXN],T; bool vis[MAXN]; namespace solution{ void make_mu(){ memset(mu,,sizeof(mu)); memset(sum,,sizeof(sum)); mu[]=; up(i,,){ ;} ;j<=cnt&&i*prime[j]<=;j++){ vis[i*prime[j]]=; )mu[i*prime[j]]=-mu[i]; else{ mu[i*prime[j]]=; break; } } } up(i,,)sum[i]=sum[i-]+mu[i]; } int get(int n,int m){ ; if(n>m)swap(n,m); ;i<=n;i=pos+){ pos=min(m/(m/i),n/(n/i)); ans+=(sum[pos]-sum[i-])*(m/i)*(n/i); } return ans; } } int main(){ //freopen("input.in","r",stdin); using namespace solution; make_mu(); T=read(); while(T--){ int a=read(),b=read(),k=read(); a/=k;b/=k; printf("%d\n",get(a,b)); } ; }
//Vijos 1889 //by Cydiater //2016.7.25 #include <iostream> #include <iomanip> #include <cstdio> #include <cstring> #include <string> #include <ctime> #include <cmath> #include <queue> #include <map> #include <cstdlib> #include <algorithm> using namespace std; #define ll long long #define up(i,j,n) for(int i=j;i<=n;i++) #define down(i,j,n) for(int i=j;i>=n;i--) +; const int oo=0x3f3f3f3f; inline ll read(){ ,f=; ;ch=getchar();} +ch-';ch=getchar();} return x*f; } ll N,prime[MAXN],cnt=,mu[MAXN],leftt,rightt,mid; bool vis[MAXN]; namespace solution{ void make_mu(){ memset(vis,,sizeof(vis)); memset(mu,,sizeof(mu)); up(i,,){ ;} ;prime[j]*i<=&&j<=cnt;j++){ vis[prime[j]*i]=; )mu[i*prime[j]]=-mu[i]; else{ mu[i*prime[j]]=; break; } } } } void init(){ N=read(); } bool check(ll num){ ll lim=1LL*sqrt(; ;i<=lim;i++) ans+=num/(i*i)*mu[i]; return ans>=N; } void slove(){ leftt=N;rightt=25505460948LL; <rightt){ mid=(leftt+rightt)>>; if(check(mid)) rightt=mid; else leftt=mid; } if(check(leftt))cout<<leftt<<endl; else cout<<rightt<<endl; } } int main(){ //freopen("input.in","r",stdin); //freopen("out.out","w",stdout); using namespace solution; make_mu(); init(); slove(); ; }
BZOJ 2440
//bzoj2440 //by Cydiater //2016.7.25 #include <iostream> #include <iomanip> #include <cstdio> #include <cstring> #include <string> #include <ctime> #include <cmath> #include <queue> #include <map> #include <cstdlib> #include <algorithm> using namespace std; #define ll long long #define up(i,j,n) for(int i=j;i<=n;i++) #define down(i,j,n) for(int i=j;i>=n;i--) +; const int oo=0x3f3f3f3f; inline ll read(){ ,f=; ;ch=getchar();} +ch-';ch=getchar();} return x*f; } ll N,prime[MAXN],cnt=,mu[MAXN],leftt,rightt,mid,T; bool vis[MAXN]; namespace solution{ void make_mu(){ memset(vis,,sizeof(vis)); memset(mu,,sizeof(mu)); up(i,,){ ;} ;prime[j]*i<=&&j<=cnt;j++){ vis[prime[j]*i]=; )mu[i*prime[j]]=-mu[i]; else{ mu[i*prime[j]]=; break; } } } } void init(){ N=read(); } bool check(ll num){ ll lim=1LL*sqrt(; ;i<=lim;i++) ans+=num/(i*i)*mu[i]; return num-ans>=N; } void slove(){ leftt=N;rightt=25505460948LL; <rightt){ mid=(leftt+rightt)>>; if(check(mid)) rightt=mid; else leftt=mid; } if(check(leftt))cout<<leftt<<endl; else cout<<rightt<<endl; } } int main(){ //freopen("input.in","r",stdin); //freopen("out.out","w",stdout); using namespace solution; make_mu(); T=read(); while(T--){ init(); slove(); } ; }
YY的GCD


这样的话如果我们能预处理出,就能很快的求出答案了。显然暴力的方法能预处理出来。
//YY de GCD //by Cydiater //2016.7.26 #include <iostream> #include <cstring> #include <string> #include <algorithm> #include <cmath> #include <queue> #include <map> #include <cstdlib> #include <cstdio> #include <iomanip> #include <ctime> using namespace std; #define ll long long #define up(i,j,n) for(int i=j;i<=n;i++) #define down(i,j,n) for(int i=j;i>=n;i--) #define FILE "YYnoGCD" const int oo=0x3f3f3f3f; ; inline ll read(){ ,f=; ;ch=getchar();} +ch-';ch=getchar();} return x*f; } ,f[MAXN],T,mu[MAXN]; bool vis[MAXN]; namespace solution{ void make_mu(){ memset(vis,,sizeof(vis)); memset(f,,sizeof(f)); mu[]=; up(i,,){ ;} up(j,,cnt){ )break; vis[prime[j]*i]=; )mu[i*prime[j]]=-mu[i]; else{ mu[i*prime[j]]=; break; } } } up(i,,cnt)up(j,,){ )break; f[prime[i]*j]+=mu[j]; } up(i,,)f[i]+=f[i-]; } void slove(ll a,ll b){ ll ans=,pos; if(a>b)swap(a,b); up(i,,a){ pos=min(a/(a/i),b/(b/i)); ans+=(f[pos]-f[i-])*(a/i)*(b/i); i=pos; } cout<<ans<<endl; } } int main(){ //freopen("input.in","r",stdin); freopen(FILE".in","r",stdin); freopen(FILE".out","w",stdout); using namespace solution; make_mu(); T=read(); while(T--){ ll a=read(),b=read(); slove(a,b); } ; }
BZOJ 4407于神之怒



//BZOJ 4407 //by Cydiater //2016.7.27 #include <iostream> #include <cstdio> #include <cstring> #include <string> #include <algorithm> #include <cstdlib> #include <queue> #include <map> #include <iomanip> #include <cmath> #include <ctime> using namespace std; #define ll long long #define up(i,j,n) for(int i=j;i<=n;i++) #define down(i,j,n) for(int i=j;i>=n;i--) ; const int LIM=5e6; const int oo=0x3f3f3f3f; ; inline int read(){ ,f=; ;ch=getchar();} +ch-';ch=getchar();} return x*f; } ll f[MAXN],prime[MAXN],cnt=,N,K,g[MAXN],T; bool vis[MAXN]; namespace solution{ inline ll quick_pow(ll a,ll b){ ll tmp=; while(b){ )tmp=(tmp*a)%mod; a=(a*a)%mod; b>>=; } return tmp; } void pret(){ memset(vis,,sizeof(vis)); f[]=; up(i,,LIM){ ;} up(j,,cnt){ if(i*prime[j]>LIM)break; vis[i*prime[j]]=; ){ f[i*prime[j]]=(f[i]*f[prime[j]])%mod; }else{ f[i*prime[j]]=(f[i]*g[j])%mod; break; } } } up(i,,LIM)f[i]=(f[i-]+f[i])%mod; } void slove(ll a,ll b){ ll ans=,pos; if(a>b)swap(a,b); up(i,,a){ pos=min(a/(a/i),b/(b/i)); ans+=(((f[pos]+mod-f[i-])*(a/i))%mod)*(b/i); ans%=mod; i=pos; } printf("%lld\n",ans); } } int main(){ freopen("input.in","r",stdin); using namespace solution; T=read();K=read(); pret(); while(T--)slove(read(),read()); ; }
BZOJ 2154

然后双重分块就好了
//BZOJ 2154 //by Cydiater //2016.7.27 #include <iostream> #include <cstdio> #include <string> #include <cstring> #include <iomanip> #include <queue> #include <map> #include <ctime> #include <cmath> #include <algorithm> #include <cstdlib> using namespace std; #define ll long long #define up(i,j,n) for(ll i=j;i<=n;i++) #define down(i,j,n) for(ll i=j;i>=n;i--) ; const ll LIM=1e7; ; const ll oo=0x3f3f3f3f; inline ll read(){ ,f=; ;ch=getchar();} +ch-';ch=getchar();} return x*f; } ll prime[MAXN],cnt=,mu[MAXN],N,M; bool vis[MAXN]; namespace solution{ void pret(){ memset(vis,,sizeof(vis)); memset(mu,,sizeof(mu)); mu[]=; up(i,,N){ ;} up(j,,cnt){ if(prime[j]*i>N)break; vis[prime[j]*i]=; ){ mu[i*prime[j]]=-mu[i]; }else{ mu[i*prime[j]]=; break; } } } up(i,,N)mu[i]=(mu[i-]+(mu[i]*i*i)%mod)%mod; } ll sum(ll a,ll b){ )*a/%mod)*(b*(b+)/%mod)%mod; } ll F(ll a,ll b){ ll pos,ans=; if(a>b)swap(a,b); up(i,,a){ pos=min(a/(a/i),b/(b/i)); ans=(ans+(mu[pos]-mu[i-])*sum(a/i,b/i))%mod; i=pos; } return ans; } void slove(ll a,ll b){ if(a>b)swap(a,b); ll pos,ans=; up(i,,a){ pos=min(a/(a/i),b/(b/i)); ans=(ans+(i+pos)*(pos-i+)/%mod*F(a/i,b/i)%mod)%mod; i=pos; } printf("%lld\n",(ans+mod)%mod); } } int main(){ freopen("input.in","r",stdin); using namespace solution; N=read();M=read(); if(N>M)swap(N,M); pret(); slove(N,M); //cout<<"Time has passed:"<<1.0*clock()/1000<<"s!"<<endl; ; }
BZOJ 2693:

//BZOJ 2693 //by Cydiater //2016.7.29 #include <iostream> #include <cstdio> #include <cstring> #include <string> #include <algorithm> #include <cmath> #include <ctime> #include <queue> #include <map> #include <cstdlib> #include <iomanip> using namespace std; #define ll long long #define up(i,j,n) for(ll i=j;i<=n;i++) #define down(i,j,n) for(ll i=j;i>=n;i--) ; const int LIM=1e7; ; const int oo=0x3f3f3f3f; inline ll read(){ ,f=; ;ch=getchar();} +ch-';ch=getchar();} return x*f; } ll f[MAXN],prime[MAXN],cnt=,T; bool vis[MAXN]; namespace solution{ void pret(){ memset(vis,,sizeof(vis)); f[]=; up(i,,LIM){ if(!vis[i]){prime[++cnt]=i;f[i]=(i-i*i%mod)%mod;} up(j,,cnt){ if(prime[j]*i>LIM)break; vis[prime[j]*i]=; ){ f[i*prime[j]]=(f[i]*prime[j])%mod; break; } f[i*prime[j]]=(f[prime[j]]*f[i])%mod; } } up(i,,LIM)f[i]=(f[i]+f[i-])%mod; } ll sum(ll a,ll b){ ll tmp1=(a*(a+)/)%mod; ll tmp2=(b*(b+)/)%mod; return (tmp1*tmp2)%mod; } void slove(ll a,ll b){ if(a>b)swap(a,b); ll pos,ans=; up(i,,a){ pos=min(a/(a/i),b/(b/i)); ans=(ans+(f[pos]-f[i-])*sum(a/i,b/i)%mod)%mod; i=pos; } printf("%lld\n",(ans+mod)%mod); } } int main(){ //freopen("input.in","r",stdin); using namespace solution; T=read(); pret(); while(T--)slove(read(),read()); ; }
Mobius 反演的更多相关文章
- SPOJ PGCD (mobius反演 + 分块)
转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents by---cxlove 题意 :求满足gcd(i , j)是素数(1 &l ...
- 关于Mobius反演
欧拉函数 \(\varphi\) \(\varphi(n)=\)表示不超过 \(n\) 且与 \(n\) 互质的正整数的个数 \[\varphi(n)=n\cdot \prod_{i=1}^{s}(1 ...
- mobius反演讲解
mobius反演的基本形式为,假设知道函数F(x)=Σf(d) d|x,那么我们可以推出f(x)=Σmiu(d)*F(x/d) d|x,另一基本形式为假设知道函数F(x)=Σf(d) x|d,那么我们 ...
- [基本操作] Mobius 反演, Dirichlet 卷积和杜教筛
Dirichlet 卷积是两个定义域在正整数上的函数的如下运算,符号为 $*$ $(f * g)(n) = \sum_{d|n}f(d)g(\frac{n}{d})$ 如果不强调 $n$ 可简写为 $ ...
- Mobius反演与积性函数前缀和演学习笔记 BZOJ 4176 Lucas的数论 SDOI 2015 约数个数和
下文中所有讨论都在数论函数范围内开展. 数论函数指的是定义域为正整数域, 且值域为复数域的函数. 数论意义下的和式处理技巧 因子 \[ \sum_{d | n} a_d = \sum_{d | n} ...
- Mobius 反演与杜教筛
积性函数 积性函数 指对于所有互质的整数 aaa 和 bbb 有性质 f(ab)=f(a)f(b)f(ab)=f(a)f(b)f(ab)=f(a)f(b) 的数论函数. 特别地,若所有的整数 aaa ...
- Mobius反演学习
这篇文章参考了许多资料和自己的理解. 先放理论基础. 最大公约数:小学学过,这里只提一些重要的公式: $·$若$a=b$,则$\gcd(a,b)=a=b$: $·$若$\gcd(a,b)=d$,则$\ ...
- Note -「Mobius 反演」光速入门
目录 Preface 数论函数 积性函数 Dirichlet 卷积 Dirichlet 卷积中的特殊函数 Mobius 函数 & Mobius 反演 Mobius 函数 Mobius 反演 基 ...
- 【莫比乌斯反演】关于Mobius反演与gcd的一些关系与问题简化(bzoj 2301 Problem b&&bzoj 2820 YY的GCD&&BZOJ 3529 数表)
首先我们来看一道题 BZOJ 2301 Problem b Description 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd( ...
- (暂时弃坑)(半成品)ACM数论之旅18---反演定理 第二回 Mobius反演(莫比乌斯反演)((づ ̄3 ̄)づ天才第一步,雀。。。。)
莫比乌斯反演也是反演定理的一种 既然我们已经学了二项式反演定理 那莫比乌斯反演定理与二项式反演定理一样,不求甚解,只求会用 莫比乌斯反演长下面这个样子(=・ω・=) d|n,表示n能够整除d,也就是d ...
随机推荐
- winddows 运行指令 (2)
cmd.exe--------CMD命令提示符 chkdsk.exe-----Chkdsk磁盘检查 certmgr.msc----证书管理实用程序 calc-----------启动计算器 charm ...
- 37-wc 简明笔记
显示行数.单词数和字节数 wc [options] [file-list] 参数 file-list是wc分析的一个或多个文件的路径名列表.如果省略file-list,wc就从标准输入中读取输入 选项 ...
- JVM执行Java程序时内存的划分
Java虚拟机在执行Java程序过程中会把它所管理的内存区域划分为若干个不同的数据区域. Java虚拟机所管理的内存包括以下几个运行时区域: 1.程序计数器(Program Couter Regist ...
- Java 关键字static final使用总结
Static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,被static修饰的成员变量和成员方法独立于该类的任何对象.也就是说,它不依赖类特定的实例,被 ...
- Dubbo系列(1)_背景介绍和基本情况
一.本文目的 主要介绍Dubbo的产生背景和需要解决的问题 二.产生背景 随着大数据量.高并发的互联网应用越来越多,单机系统已经无法满足系统的需要.通过SOA搭建一个分 ...
- css3 操作动画要点
CSS3 有3种和动画相关的属性:transform, transition, animation. 不同点: 1. 触发条件不同.transition通常和hover等事件配合使用,由事件触发.a ...
- Spring注解@PostConstruct与@PreDestroy
关于在spring 容器初始化 bean 和销毁前所做的操作定义方式有三种: 第一种:通过@PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作 第二 ...
- git初体验(三)git分支
分支的理念就是分身,就像孙悟空拔出猴毛变出很多跟自己一模一样的猴子,然后每个猴子做自己的事情互不干涉,等到所有猴子做完之后,猴子集合来合并劳动成果,然后悟空就把那些猴子猴孙门统统收回了. 你创建了一个 ...
- pycharm实用快捷键
提示 CTRL Q: 在参数列表位置,显示可以输入的所有参数. CTRL Q: 查看选中方法的文档字符串 阅读 CTRL -: 折叠当前代码 CTRL +: 展开当前代码 CTRL SHIFT -: ...
- 使用jquery.qrcode生成二维码支持logo,和中文
/* utf.js - UTF-8 <=> UTF-16 convertion * * Copyright (C) 1999 Masanao Izumo <iz@onicos.co. ...