首页 > 其他 > 详细

容斥原理与莫比乌斯反演的关系

时间:2016-04-19 00:02:30      阅读:403      评论:0      收藏:0      [点我收藏+]
技术分享
//容斥原理,c[i]表示i当前要算的次数,复杂度和第二层循环相关 O(nlogn~n^2)
LL in_exclusion(int n,int *c)
{
    for(int i=0;i<=n;i++) c[i]=1;    //不一定是这样初始化,要算到的才初始化为1
    LL ans=0;
    for(int i=0;i<=n;i++) if(i要算)
    {
        ans+=(统计数)*c[i];
        for(int j=i+1;j<=n;j++) if(i会算到j) c[j]-=c[i];//j要算的次数减去算i时已经算了的次数
    }
    return ans;
}
容斥原理伪代码

容斥原理结论:

1~nx的倍数有n/x,因而gcd(a1,a2,...,am)=kx(1<=ai<=n)中的ai都在这n/x个数中,若ai<a(i+1),则可用容斥原理算出gcd(a1,a2,...,am)=x的对数。

也可以用莫比乌斯反演:

当F(n) = sigma{f(d),n|d},则f(n) = sigma{mu(d/n)*F(d),n|d} 

f(x)表示1~n中选m个数gcd=x的个数,则F(x)表示1~n中选m个数的gcd=kx的个数

然后f(n)=sigma{mu(x/n)*F(x),n|x}

题目链接:https://icpc.njust.edu.cn/Problem/Local/1923/

这里容斥原理算出的c[i]和莫比乌斯函数u[i]相等,说明莫比乌斯反演就是一种容斥,

不过是逆思维的容斥,即将问题细分为互斥的最小元,所有最小元的就是结果

因此,别的容斥也可以将算的过程中需要用到的u[i]一次算出,后面直接利用该数组

F(n)=sigma{f(x),xn满足的条件}<==>f(n)=sigma{u(逆条件)*F(x),xn满足的条件}

这个结论在国家集训队2013论文集中的浅谈容斥原理有提到

技术分享
 1 LL in_exclusion(int x,int n,int *c)
 2 {
 3     n/=x;
 4     for(int i=0;i<=n;i++) c[i]=1;
 5     LL ans=0;
 6     for(int i=2;i<=n;i++)
 7     {
 8         ans+=C(n/i,m)*c[i];
 9         for(int j=i<<1;j<=n;j+=i) c[j]-=c[i];
10     }
11     return C(n/i,m)-ans;
12 }
View Code

 

容斥原理与莫比乌斯反演的关系

原文:http://www.cnblogs.com/cdyboke/p/5406221.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!