组合数学
兜率工
XJTU 硕士研究生在读
展开
-
CodeForces - 839D Winter is here 容斥
题意:给出一个序列,求其中所有 gcd 大于 1 的子序列乘以序列长度之和。分析:利用埃氏筛的原理,求出在数组中有多少i的倍数,假设有x个数是i的倍数,则这x个i的倍数的排列有x * 2 ^ (x-1)PS:1*C(x,1)+2*C(x,2)*...+x*C(x,x),故排列有 x * 2 ^ (x-1)个。但是对于2,4,8来说,4和8都是2的倍数,但gcd(4,8) = 4,...原创 2019-02-18 00:02:14 · 153 阅读 · 0 评论 -
快速计算1-n中所有数的素因子
const int maxn=1e5+10;int prime[maxn],cnt;bool vis[maxn];vector<int> f[maxn];void get_prime_fac(){ for(int i=2;i<maxn;i++){ if(!vis[i]){ prime[cnt++]=i; ...原创 2018-10-12 10:34:43 · 930 阅读 · 0 评论 -
ACM-ICPC 2018 沈阳网络赛 C Convex Hull (莫比乌斯+容斥)
long long 爆的我心痛,现在编译器都支持128位的了。。。神奇,电脑编译器都过不了(老了),交上去ac了,就是复杂度还有点高,应该不是正解,不过又get到了新知识,不过也有的巨佬说是余数太大的缘故,所以中间采用 int128参考博文:https://blog.csdn.net/qkoqhh/article/details/82532516#commentsedit很菜,容斥...原创 2018-09-27 15:39:32 · 584 阅读 · 0 评论 -
HDU - 5468 Puzzled Elena (容斥/莫比乌斯)
做了好几个容斥了,一直找不到feel,这个做完在现在有一点感觉了。虽然刚开始也不会。但就是发现感觉不一样了。首先,不考虑树的关系,单纯给出一个m,还有一个集合(里面数字任意),求集合里面跟m互质的数的个数。这就是典型的容斥题。那么现在要求得使顶点跟子节点的互质关系,那么原理还是有容斥喽,还是回到一开始那个问题,如何计算跟m互质的数的个数,做法是将m进行质因子分解,然后计算集合中有多少能被m...原创 2018-10-12 00:42:48 · 202 阅读 · 0 评论 -
BZOJ 2440 完全平方数(莫比乌斯函数+容斥)
注意的两点是二分的时候注意,要选取最小的那个答案,因为19是13个,20也是13个,而很明显19才是符合答案的。还有感觉题目给的数据范围不对,实际比较大,所以二分的时候r大点。#include<bits/stdc++.h>using namespace std;const int maxn=1e5+10;int prime[maxn];bool ch...原创 2018-09-22 10:59:28 · 169 阅读 · 0 评论 -
容斥定理(三种模板)
若在n较大的情况下,应该采用递归进行计算,位运算计算循环次数太多,反而很慢。在集合1,2,3…600,中,取出能被2,3,5,整除的数的个数典型的容斥定理:放出模板:递归#include<bits/stdc++.h>using namespace std;int a[]={2,3,5};int b=600;int sum=0;int n=3;v...原创 2018-09-20 22:53:15 · 985 阅读 · 0 评论 -
POJ 3370 鸽巢原理
这个题要知道一个定理。给定m个数,a1,a2,a3,.....am,至少存在整数k,l,(1<=k<l<=m)使得ak+....+al是m的倍数。构造前缀和:s1=a1;s2=a1+a2;s3=a1+a2+a3;...sm=a1+a2+...+am;(1)如果有一个sn是m的倍数,则定理得证。(2) 如果在上面没有一个是m的倍数。令rh=Sh%...原创 2018-09-20 21:58:08 · 402 阅读 · 0 评论 -
2018 ACM-ICPC 南京网络赛 J-sum (莫比乌斯函数+整除分块)
题意:f(x)表示x分解为a*b且a b中均不含平方因子的方案数目(ab ba算两种),求f(1)+......+f(n)思路:可以发现这个跟莫比乌斯函数一样,不知道的自行百度。那么题意可以简化为:这不就很简单啦嘛,直接整除分块搞一下就OK的啦。#include<bits/stdc++.h>using namespace std;typedef l...原创 2018-09-25 22:38:30 · 232 阅读 · 0 评论 -
HDU5972 Regular Number (bitset匹配)
使用bitset<N> b[10] ,b[i][j]表示值为i的数可以出现在子串的那些位置,即下标,那么对主串进行遍历 i=0:len-1 。另外定义一个变量bitset<N> ans ,每次先将ans左移一位,然后将最低位置1,然后令k=当前输入的数,将ans=ans&b[k], 如果当前ans[N-1]==1,那么主串s[i-N+1]~s[i]就是合法子串,输出...原创 2018-10-01 15:42:08 · 172 阅读 · 1 评论 -
子集生成(位运算)
/*一共有2的n次幂种情况,每一种情况所对应的2进制数一定不相同,将二进制的1视为选中这个数,0视为不选,因因此将二进制的j一位一位向右移动并判断是否输出*/#include<bits/stdc++.h>using namespace std;int a[]={1,2,3,4,5};int n=5;int main(){ for(int i=0;...原创 2018-09-27 20:46:14 · 346 阅读 · 0 评论 -
HDU 5514 Frogs 容斥(好题)
首先,这个题跟一般的容斥题不太一样。题意:有m个石子围成一圈, 有n只青蛙从跳石子, 都从0号石子开始, 每只能越过xi个石子。问所有被至少踩过一次的石子的序号之和。 分析:多画几组数据可以看出:走的石头的编号就是步数跟石头数的最大共约数,那么第一想法就是容斥,最普通不过了,例如第一个样例,明显就是m以内2的倍数+3的倍数-2和3的倍数。然而失望的是n的范围太大,无法是直接这样算。换种思路...原创 2018-10-12 19:42:05 · 170 阅读 · 0 评论 -
HDU-4790 容斥+思维
题意:从区间 [ a , b ] 中间选择一个数 x ,从区间 [ c , d ] 中间选择一个数 y ,使得( x + y )% p == m 问几率有多大。输出按照最简分式;分析:直接在这两个区间中间选择数不好选,那么可以算区间 [ 0 , b ] 跟区间 [ 0 , d ] 中间有多少满足的,然后容斥以下。设 f ( a , b ) 表示的是在区间0~a和区间0~...原创 2018-10-09 20:01:40 · 241 阅读 · 0 评论 -
HDU 4336 容斥+概率
以第二组数据为例,A=0.1,B=0.4;那么很容易得出要取出A最少要10张卡片。取出B最少要2.5张卡片。但是两者中都包含了 即最少能取到两者中的一个。那么这就是很典型的容斥了。#include<bits/stdc++.h>using namespace std;typedef long long ll;double a[25];int...原创 2018-09-30 01:15:46 · 213 阅读 · 0 评论 -
HDU 3929 二项式判奇偶+容斥
参考博客:https://blog.csdn.net/whyorwhnt/article/details/22320389#include<bits/stdc++.h>using namespace std;typedef long long ll;ll a[20];int get_bit(ll k){ int cnt=0; while(k){...原创 2018-09-29 22:45:17 · 174 阅读 · 0 评论 -
2018 ACM-ICPC 沈阳网络赛 G. Spare Tire (容斥)
根据题意打表可以得到通项公式 转化题意,即求在1-n中与m互质的数套用上述公式的和。那么这就是最简单的容斥模型。看这个:https://blog.csdn.net/qq_40679299/article/details/82873829将求个数改为求和即可,原理跟上面一样,计算平方和的时候直接套用公式就好。附代码:#include<bits/stdc++.h&g...原创 2018-09-28 23:18:34 · 165 阅读 · 0 评论 -
HDU-2461 Rectangles 容斥
题意:给出n个矩形的左下角和右上角坐标,要求进行m次操作,每次对t个矩形进行涂色(给出这t个矩形的序号),要求计算出每次涂色时需要涂色的面积。(涂色可以覆盖,即每次操作不受前面任何操作的影响)。分析:因为n很小,所以明显用容斥就可以解决。奇加偶减,算相交面积。一直习惯用位写容斥,但这个题n是20,循环过多,TLE了,然后看vj上有人先用位打了个表,也挺快的,不过没看懂,还是换过来用dfs写...原创 2018-10-14 11:16:11 · 250 阅读 · 0 评论 -
UVA 11806 - Cheerleaders(容斥原理)
题意: 在m行n列的矩形网格中放置k个相同的石子,要求第一行、最后一行、第一列、最后一列都必须有石子,问一共有多少种放置的方法。分析: 由容斥原理,设第一行没有石子的方法数为A,最后一行没有石子的方法数为B,第一列没有石子的方法数为C,最后一列没有石子的方法数为D,不加任何限制而放置k个石子的总方法数为S。那么答案应该为S - (A U B U C U D)。用二进制的方式表示集合A、B、C...原创 2018-10-13 23:53:25 · 139 阅读 · 0 评论 -
HDU - 5768(中国剩余定理+容斥定理)
题意:小明认为能被7整除的数能给他带来好运,但是如果这些数存在x%pi=ai(1<=i<=n)的话,它反而会给小明带来坏运。问[x,y]区间里有多少个数能给小明带来好运?分析:明显的容斥题,但在容斥过程中得算x%pi=ai(1<=i<=n)中的x,明显是中国剩余定理。那么在计算过程中,将能被7整除看成%7==0,具体思想看代码。#include<...原创 2018-10-13 15:56:30 · 269 阅读 · 0 评论 -
HDU 4135 容斥
最基本的容斥运用吧。熟练用一下几种计算容斥的方法1.位运算法:#include<bits/stdc++.h>using namespace std;typedef long long ll;int p[50];int cnt=0;ll cal(ll n){ ll res=0; for(int i=1;i<(1<<cnt)...原创 2018-09-27 21:56:56 · 166 阅读 · 0 评论 -
HDU 1695 (莫比乌斯入门)
题意:从区间[1,B]选择一个x,从区间[1,D]选择一个数y,使得gcd(x,y)==k 的方案数。莫比乌斯反演学习,感觉百度百科就非常好,其他的没有什么大的区别。解题思路:下面分两种办法进行求解。首先,当然得用到莫比乌斯函数以及莫比乌斯反演了1.采用莫比乌斯反演进行计算。先将题意简化,那么就可以表达为:那么求前者的个数就相当于求后者的个数。设:表示的个数...原创 2018-09-20 01:11:14 · 258 阅读 · 0 评论 -
BZOJ 2154 (莫比乌斯反演)
参考博客https://blog.csdn.net/qkoqhh/article/details/82180994OIer的题不好玩呀,不过真是佩服这些大佬们。注意init初始化的时候,for不能直接开到maxn,按理说不会啊,但确实是T了#include<bits/stdc++.h>using namespace std;typedef long long ll...原创 2018-09-25 17:20:56 · 195 阅读 · 0 评论 -
BZOJ 3529 ( 莫比乌斯反演 + 树状数组维护狄利克雷卷积 )
参考博客:https://www.lydsy.com/JudgeOnline/problem.php?id=3529#include<bits/stdc++.h>using namespace std;const int maxn=1e5+10;int mu[maxn],ans[maxn],c[maxn],vis[maxn],p[maxn],t[maxn],g[max...原创 2018-09-25 13:34:54 · 133 阅读 · 0 评论 -
拓展卢卡斯定理
再看下面讲解之前,请大家熟悉一下乘法逆元,中国剩余定理,拓展gcd,费马小定理 关于拓展卢卡斯,也就是卢卡斯的升级版,卢卡斯限定只能取余一个素数,而拓展卢卡斯则没有限定 其求解方法如下: 若不是素数,将p分解质因数,将C(n,m)分别按照Lucas定理中的方法求对p的质因数的模,然后用中国剩余定理合并。比如计算C(10,3)%14。C(10,3)=120,14有两个质因数2和7,120...原创 2018-05-29 13:21:23 · 3657 阅读 · 2 评论 -
卢卡斯定理(十分钟带你看懂)
在开始之前我们先介绍3个定理:1.乘法逆元如果ax≡1 (mod p),且gcd(a,p)=1(a与p互质),则称a关于模p的乘法逆元为x。2.费马小定理: 3.扩展欧几里得已知整数a、b,扩展欧几里得算法可以在求得a、b的最大公约数的同时,能找到整数x、y(其中一个很可能是负数),使它们满足贝祖等式ax + by = gcd(a, b)。好了,在明白上面的定理后我们开始...原创 2018-05-28 22:26:33 · 32880 阅读 · 17 评论 -
POJ 2992(求C(n,k)的约数个数)
首先肯定不可能一个一个进行计算 采用数论中的相关知识可以得到求解本题的两个公式, 对于任于的数p=n1p1∗n2p2∗n3p3.....p=n1p1∗n2p2∗n3p3.....p = n1 ^p1 * n2 ^ p2 * n3 ^ p3 ..... p的因数个数为(1+p1)∗(1+p2)∗(1+p3)....(1+p1)∗(1+p2)∗(1+p3)....(1 + p1) * (1 +...原创 2018-06-05 21:16:22 · 401 阅读 · 0 评论 -
POJ 2775 (卢卡斯+二叉树)
一种数组做法,一种指针做法 可以看出指针比数组所用时间少而且所占内存也少#include &lt;iostream&gt;#include &lt;stdio.h&gt;#include &lt;algorithm&gt;#include&lt;cstring&gt;using namespace std;struct node{ int idx;原创 2018-05-28 15:11:25 · 419 阅读 · 1 评论 -
容斥定理计算一个数内跟他互素的数的个数
#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>using namespace std;typedef long long ll;ll m,p[100],cnt,sum,a[100];//计算因子void fac(){ cnt=...原创 2018-05-17 13:12:01 · 890 阅读 · 0 评论 -
POJ 1091 (容斥定理+多元同余方程)
参考博客:https://blog.csdn.net/qq_33199236/article/details/52832706 https://blog.csdn.net/meituanwaimai/article/details/79090140#include&lt;cstdio&gt;#include&lt;cstring&gt;#include&lt;algorithm&gt...原创 2018-05-17 12:51:45 · 316 阅读 · 0 评论 -
UVA294 UVALive5595 Divisors【一个区间最大正因子数】
要是感觉下面的代码不好理解,可以参考https://blog.csdn.net/qq_40679299/article/details/79948885#include<iostream>#include<stdio.h>#include<algorithm>#include<stdlib.h>#include<string.h&g...原创 2018-04-15 15:55:45 · 225 阅读 · 0 评论 -
c(n,m)函数(模板)
typedef unsigned long long ULL;ULL c(int n,int m){ ULL c; if(n<m) c=0; else if(n==m||m==0) c=1; else { c=1; n=n-m+1; for(int i=1;i<...原创 2018-04-15 14:34:54 · 1343 阅读 · 0 评论 -
小于等于N且与素数集合互素的数的个数(容斥)
ll solve(ll n){ ll res=0; for(int i=1;i<(1<<k);i++){ ll f=-1; ll tmp=n; for(int j=0;j<k;j++){ if((i>>j)&1==1){ f*=-1;...原创 2018-07-22 23:59:44 · 397 阅读 · 0 评论 -
POJ 3252 Round Numbers (组合数)
解析来源:http://poj.org/showmessage?message_id=158333 以sample为例子 [2,12]区间的RoundNumbers(简称RN)个数:Rn[2,12]=Rn[0,12]-Rn[0,1] 即:Rn[start,finish]=Rn[0,finish]-Rn[0,start-1] 所以关键是给定一个X,求出Rn[0,X...原创 2018-09-07 20:50:29 · 151 阅读 · 0 评论 -
洛谷P2257 莫比乌斯反演
#include<bits/stdc++.h>using namespace std;const int maxn=1e7+10;typedef long long ll;bool vis[maxn];int mu[maxn];ll sum[maxn];int prime[maxn];int g[maxn];void get_mu(in...原创 2018-09-24 09:24:28 · 300 阅读 · 0 评论 -
UVA 861 棋盘多项式
题目简述:给出一个n*n的国际象棋棋盘,上面能放k个互补攻击的象有多少种方法(在对角线的话会相互攻击)分析: #include<bits/stdc++.h>using namespace std;const int N=8;int b[N+1],w[N+1],rb[N+1][65],rw[N+1][65];void init(int n){ ...原创 2018-09-17 19:45:49 · 502 阅读 · 2 评论 -
POJ 2661 斯特灵公式
斯特灵公式是一条用来取n阶乘近似值的数学公式。一般来说,当n很大的时候,n阶乘的计算量十分大,所以斯特灵公式十分好用,而且,即使在 n很小的时候,斯特灵公式的取值已经十分准确。公式:用斯特灵公式打表:#include<cstdio>#include<cstring>#include<algorithm>#include<cmat...原创 2018-09-10 14:41:58 · 193 阅读 · 0 评论 -
指数型母函数
问题原型:n个元素组成的多重集,其中a1重复了n1次,a2重复了n2次......ak重复了nk次,若 n=n1+n2+...+nk 从n个元素取出r个排列,求不同的排列数。公式: HDU1521 为例的模板:#include<cstdio>#include<cstring>#include<algorithm>using na...原创 2018-09-10 13:58:09 · 283 阅读 · 0 评论 -
POJ 1014 Dividing (多重背包or母函数)
母函数求解:需要注意一点,有个结论,但我还查不到这个结论哪里来的。。。如果n>=8,可将n改写为12(n为偶数),或者11(为奇数)。#include<cstdio>#include<cstring>using namespace std;int a[7];const int maxn=3e7;int x[maxn];int y[ma...原创 2018-09-10 07:51:08 · 352 阅读 · 0 评论 -
卡特兰数
先放一张图 在ACM中的例子有:1.二叉树的计数2.AB排列问题(n个A和n个B排成一排,从第一个位置开始到任何位置,B的个数不能超过A的个数)3.乘法加括号(有多少种不同的运算顺序)4.欧拉多边形分割问题(凸n边形用n-3条不相交的对角线分成n-2个互相没有重叠的三角形)5.在圆上选择2n个点,将这些点成对链接起来使得所得到的n条线段不相交,一共有多少种方法6.一...原创 2018-09-06 21:47:11 · 205 阅读 · 0 评论 -
普通母函数
HDU 1028将一个整数写成几个整数的加和,一共可以写出多少种。(数字相同顺序不同算一种)#include<bits/stdc++.h>using namespace std;int a[122],b[122];int main(){ int n; while(scanf("%d",&n)!=EOF){ memset(a,...原创 2018-09-09 08:22:24 · 150 阅读 · 0 评论 -
POJ 1850 Code (组合数)
参考博客上边这篇博客写的很清楚,也讲的非常好。对这种题突然有了一点感悟了。#include<cstdio>#include<cstring>int c[27][27];void init(){ c[0][0]=1; c[1][0]=1; c[1][1]=1; for(int i=2;i<27;i++){ ...原创 2018-09-08 09:37:24 · 122 阅读 · 0 评论