HELLO WORLD--一起加油(🍺)!|

kingwzun

园龄:3年6个月粉丝:111关注:0

2022-08-16 21:58阅读: 210评论: 0推荐: 0

数学 _ 容斥原理

概述

引子:
如何计算这个图形的面积?
image
很显然:

|ABC|=|A|+|B|+|C||AB||BC||CA|+|ABC|

把上述问题推广到一般情况,就是我们熟知的容斥原理。

定义

集合的并

设 U 中元素有 m 种不同的属性,而第 i 种属性称为Pi ,拥有属性 Pi 的元素构成集合Si,那么,集合Si的并为:
i=1mSi=S1+S2++Sm
(S1S2+S1S3++Sm1Sm)
+(S1S2S3++Sm2Sm1Sm)
++(1)m1(i=1mS)

复杂度:O(2m)

集合的交

对于全集 U 下的 集合的并 可以使用容斥原理计算,而 集合的交 则用全集减去 补集的并集 求得

i=1nSi=Ui=1nSi¯

原文

应用

区间[L,R]中与 k 互质的数的个数

原文

模板题
复杂度: O(2fac[k]) 其 中 fac[k]k 的质因子的种类数。

当fac[k]为10时(时间复杂度才1e3),k就已经大于1e9
image

结论就是1e18的范围内,都可以算出来

模板代码:

int a[N],num;
void getprime(int x){
num=0;
for(int i=2;i*i<=x;i++){
if( x%i==0){
a[num++]=i;
while(x%i==0)
x/=i;
}
}
if(x>1) a[num++]=x;
}
int qu(int r,int x){
getprime(x);
int ans=0;
for(int i=1;i<(1<<num);i++){
int k=0;
int mul=1;
for(int j=0;j<=num;j++){
if(i& (1<<j)){
k++;
mul*=a[j];
}
}
if(k%2) ans+=r/mul;
else ans-=r/mul;
}
if(ans<0) return 0;
if(r-ans<0) return 0;
return r - ans;
}
int que(int l,int r,int k){
return qu(r,k)-qu(l-1,k);
}

本文作者:kingwzun

本文链接:https://www.cnblogs.com/kingwz/p/16593164.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   kingwzun  阅读(210)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起