博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NOI 2016 循环之美 (莫比乌斯反演+杜教筛)
阅读量:4647 次
发布时间:2019-06-09

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

题目大意:略  鉴于洛谷最近总崩,附上

任何形容词也不够赞美这一道神题

 

$\sum\limits_{i=1}^{N}\sum\limits_{j=1}^{M}[gcd(i,j)==1][gcd(j,K)==1]$

$\sum\limits_{j=1}^{M}[gcd(j,K)==1]\sum\limits_{i=1}^{N}[gcd(i,j)==1]$

我们先处理右边的式子$\sum\limits_{i=1}^{N}[gcd(i,j)==1]$:

$\sum\limits_{i=1}^{N}\sum\limits_{d|gcd(i,j)}\mu(d)\sum\limits_{j=1}^{M}[gcd(j,K)==1][d|j]$

$\sum\limits_{d=1}^{N}\mu(d)\left \lfloor \frac{N}{d} \right \rfloor \sum\limits_{j=1}^{M}[gcd(j,K)==1][d|j]$

$\sum\limits_{d=1}^{N}\mu(d)\left \lfloor \frac{N}{d} \right \rfloor \sum\limits_{j=1}^{\left \lfloor \frac{M}{d} \right \rfloor}[gcd(jd,K)==1]$

加下来就是比较关键的一个展开式子,[gcd(jd,K)==1]是[gcd(d,K)==1]&[gcd(j,K)==1]的充分必要条件:

$\sum\limits_{d=1}^{N}[gcd(d,K)==1]\mu(d)\left \lfloor \frac{N}{d} \right \rfloor \sum\limits_{j=1}^{\left \lfloor \frac{M}{d} \right \rfloor}[gcd(j,K)==1]$

84分算法:

令$f(n)=\sum\limits_{i=1}^{n}[gcd(i,K)==1]$

这是啥?

欧拉函数$\varphi$啊!别和我一样反演傻了连欧拉函数的定义都忘了

$f(n)=\left \lfloor \frac{n}{K} \right \rfloor \varphi(K) + \sum\limits_{i=1}^{n\;mod\;K}[gcd(i,K)==1]$

预处理出$\varphi(K)$和$\sum\limits_{i=1}^{n}[gcd(i,K)==1]$,那么$f(n)$就能在$O(1)$求得

可$\sum\limits_{i=1}^{n}[gcd(i,K)==1]\mu(d)$就不能用$\varphi$了,但经过计算,$g$数组能在大约$O(n*K的质因子个数)$的时间内处理出来,极限情况也只不超过$2.6 \cdot 10^{7}$

那么这个问题就在$O(n)$的时间内被解决了

蒟蒻的代码写得非常迷就不放了

 

100分算法:

这是一道神仙题

先放上原式:$\sum\limits_{d=1}^{N}[gcd(d,K)==1]\mu(d)\left \lfloor \frac{N}{d} \right \rfloor \sum\limits_{j=1}^{\left \lfloor \frac{M}{d} \right \rfloor}[gcd(j,K)==1]$

$\sum\limits_{j=1}^{\left \lfloor \frac{M}{d} \right \rfloor}[gcd(j,K)==1]$可以用$84$分算法里的方法预处理,每次$O(1)$得到

现在令$g(N,K)=\sum\limits_{i=1}^{N}[gcd(i,K)==1]\mu(i)$

$=\sum\limits_{i=1}^{N}\mu(i)*\sum\limits_{d|i}\mu(d)$

$=\sum\limits_{d|K}\mu(d) \sum\limits_{i=1}^{N} [d|i]\mu(i)$

$=\sum\limits_{d|K}\mu(d) \sum\limits_{i=1}^{\left \lfloor \frac{N}{d} \right \rfloor} \mu(id)$

关键的部分来了

如果两个数$gcd(x,y)==1$,说明它们没有公共因子,满足积性函数的性质,那么$\mu(xy)=\mu(x)\mu(y)$

反之它们存在公共因子,那么$\mu(xy)$一定等于$0$

利用这个性质

$=\sum\limits_{d|K}\mu(d)^{2} \sum\limits_{i=1}^{\left \lfloor \frac{N}{d} \right \rfloor} [gcd(i,d)==1]\mu(i)$

诶!右面这个东西$\sum\limits_{i=1}^{\left \lfloor \frac{N}{d} \right \rfloor} [gcd(i,d)==1]\mu(i)$,似乎就是$g(\left \lfloor \frac{N}{d} \right \rfloor,d)$啊!

递归求解即可

当$n==0$是,答案就是$0$

发现$K==1$时不能继续递归了否则会死循环,此时

$G(n,1)=\sum\limits_{i=1}^{n} [gcd(i,1)==1]\mu(i)=\sum\limits_{i=1}^{n} \mu(i)$

$n$可能很大,上杜教筛即可

1 #include  2 #include 
3 #include
4 #include
5 #include
6 #include
7 #define N1 20000010 8 #define M1 2000010 9 #define K1 201010 #define ll long long11 #define dd double12 #define cll const long long 13 #define it map
::iterator14 using namespace std;15 16 int N,M,K,maxn;17 int mu[N1],smu[N1],pr[M1],cnt,phik; bool use[N1];18 int f[K1],ps[K1],son[K1],is[K1],pn,sn;19 vector
ss[K1];20 void Pre()21 {22 int i,j,x; mu[1]=smu[1]=1;23 for(i=2;i<=maxn;i++)24 {25 if(!use[i]){ pr[++cnt]=i; mu[i]=-1;}26 for(j=1;j<=cnt&&i*pr[j]<=maxn;j++)27 {28 use[i*pr[j]]=1;29 if(i%pr[j]){ mu[i*pr[j]]=-mu[i];}30 else{ break; }31 }32 smu[i]=smu[i-1]+mu[i];33 }34 for(son[++sn]=1,x=K,phik=K,i=2;i<=K;i++)35 {36 if(x%i==0){ ps[++pn]=i; phik=phik/i*(i-1); while(x%i==0) x/=i; }37 if(K%i==0){ son[++sn]=i; }38 }39 for(j=1;j<=pn;j++) 40 for(i=ps[j];i<=K;i+=ps[j]) is[i]=1;41 for(i=1;i<=K;i++) f[i]=f[i-1]+(is[i]?0:1);42 for(i=1;i<=sn;i++)43 {44 x=son[i];45 for(j=1;j<=x;j++)46 if(x%j==0&&mu[j]) ss[x].push_back(j);47 }48 }49 map
mp;50 ll Smu(int n)51 {52 if(n<=maxn) return smu[n];53 it k=mp.find(n);54 if(k!=mp.end()) return k->second;55 int i,la;ll ans=1;56 for(i=2;i<=n;i=la+1)57 {58 la=n/(n/i);59 ans-=1ll*Smu(n/i)*(la-i+1);60 }61 mp[n]=ans;62 return ans;63 }64 ll F(int x){ return 1ll*(x/K)*phik+f[x%K];}65 ll G(int n,int k)66 {67 if(!n) return 0;68 if(k==1) 69 {70 if(n<=maxn) return smu[n];71 else return Smu(n);72 }73 int i,d;ll ans=0;74 for(i=0;i

 

转载于:https://www.cnblogs.com/guapisolo/p/10241081.html

你可能感兴趣的文章
常用的第三方模块 chardet url
查看>>
Js中的subStr和subString的区别
查看>>
libpcap详解
查看>>
一键安装Redmine
查看>>
docker的基础命令
查看>>
软件工程第十二次作业 - 每周例行汇报
查看>>
画任意两点之间的连线
查看>>
C# 深化基本概念
查看>>
Word2Vec实现原理(Hierarchical Softmax)
查看>>
Linux shell 只删除目录下所有(不知道文件名字)文件,只删除文件夹
查看>>
实验六--静态路由
查看>>
PLSQL DBMS_DDL.ANALYZE_OBJECT
查看>>
对Dataguard的三种模式的理解
查看>>
网络原理
查看>>
JS学习笔记
查看>>
写日记的好处
查看>>
扩展欧几里得(手推)
查看>>
火星人
查看>>
2017-10-5 清北刷题冲刺班p.m
查看>>
bzoj 2844: albus就是要第一个出场
查看>>