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 ...
随机推荐
- 226 Invert Binary Tree
/** * Definition for a binary tree node. * function TreeNode(val) { * this.val = val; * this.left = ...
- (六)观察者模式详解(包含观察者模式JDK的漏洞以及事件驱动模型)
作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 本章我们讨论一个除前面的单例 ...
- PowerShell Script to Deploy Multiple VM on Azure in Parallel #azure #powershell
Since I need to deploy, start, stop and remove many virtual machines created from a common image I c ...
- AutoMapperHelper
/// <summary> /// AutoMapper帮助类 /// </summary> public static class AutoMapperHelper { // ...
- Windows7 x64配置 Apache2 + PHP5 + MySQL5
1:相关软件下载: Apache HTTP Server 版本:(httpd-2.2.25-win32-x86-openssl-0.9.8y) PHP ...
- background-position 50% 50%是如何计算的
background-position:value1 value2 value1和value2的值可以值绝对值也可以是百分数,大部分值都很好理解,但是50% 50%这两个值是如何计算的呢? 图片水平和 ...
- 【原创】你知道OneNote的OCR功能吗?office lens为其增大威力,中文也识别
OneNote提供了强大的从图片中取出文字的功能,大家只要装上了桌面版OneNote(本人用的2013版和win8.1版测试的,其他版本为测),将图片放在OneNote笔记中,右键图片即可把图片中的文 ...
- jquery validate 隐藏域内容验证
- elasticsearch installation guide
UBUNTU 14.04 LTS 安装 elasticseach同步MYSQL表并实现中文搜索 ==================================================== ...
- js_RGB转16进制(rgb2hex)
输入:rgb(13,0,255) 输出:#0d00ff 在线颜色转换工具:http://www.atool.org/colorpicker.php 1 2 3 4 5 6 7 8 9 function ...