组合数学
穷源溯流
路很长,尽管走便是。
展开
-
洛谷 P5002 专心OI - 找祖先
const int N=5e5+5; int n,m,_; int i,j,k; int a[N]; int sz[N],fa[N],son[N],dep[N]; vector<int> G[N]; int ans[N]; void dfs1(int u,int f){ dep[u]=dep[f]+1; fa[u]=f; sz[u]=1; for(int i=0;i<G[u].s...原创 2021-04-28 08:57:27 · 182 阅读 · 0 评论 -
Codeforces Round #716 (Div. 2) B. AND 0, Sum Big(组合数学)
ll pow_mod(ll a,ll x){ ll ans=1; while(x){ if(x&1) ans=ans*a%mod; a=a*a%mod; x>>=1; } return ans;}int main(){ //IOS; rush(){ sdd(n,m); ll ans=pow_mod(n,m); pll(ans...原创 2021-04-20 08:18:50 · 235 阅读 · 0 评论 -
Codeforces Round #691 (Div. 2) B. Move and Turn
有一个机器人,一开始的朝向是任意的,方向只有正北,正南,正东,正西 4 个方向,机器人只能向前走,且每次走完了之后都会旋转 90° ,问走 n 步后可能到达多少个不同的格子可以发现走的步数与顺序无关,令 x=n/2如果走偶数步,那么在水平方向上有 ,在竖直方向上同样也有,我们需要计算有多少项,x=-x+2(c-1),加上首项 -x,一共有 x+1 项,所以答案为 如果走奇数步,那么水平方向可能有 x+1 步,也可能有 x 步,所以答案为 2*(x+1)*(x+2)int m...原创 2021-01-23 11:44:32 · 155 阅读 · 0 评论 -
POJ 3904 Sky Code(gcd=1 的容斥原理)
给出 n 个数,选出 4 个数,要求他们的 gcd =1,问有几种选择这个题不大好想,想对了也不一定码对了这个题一看就不能按照题意来硬求,我们考虑一下反面,从这 n 个数任意选出 4 然后减去 gcd!=1 的情况但是计算选出 4 个数 gcd!=1 的情况好像也不是那么简单可以发现任意四个数的 gcd 为其中的这四个数的因数 而且每个数都不超过 1e4 ,所以我们对其进行质因数分解 在利用容斥原理枚举每个 a[] 出现的因数 x,记录每个因数 x 出现的次数( 任选 4...原创 2020-11-09 23:06:50 · 484 阅读 · 0 评论 -
Ural 1091. Tmutarakan Exams(容斥原理+组合计数)
给出范围 [1,m] ,要求你从中找到 n 个数,使这 n 个数的 gcd > 1 ,但是个个数都不相同,问有几种选择由于 n m 的范围都很小 (<=50),所以打一下小于 50 的素数表,我们可以让 gcd = 2 / 3 /4……但是 4 被 2 全包括了,所以只要统计 gcd 为素数的情况,所以又要利用容斥原理,处理 gcd 为多个质数相乘的情况,最后根据组合计数原理, m/gcd 个位置,放 n 个数,答案为。const int N=50+5; in...原创 2020-11-09 10:39:40 · 249 阅读 · 0 评论 -
ZOJ 3233 Lucky Number(容斥原理×2)
给你 n 个幸运数字,和 m 个不幸运数字,定义好数:被任意一个幸运数字整除且不被任意的不幸运数字整除的称为好数,求 [L,R] 区间内有多少好数题目看起来不算很简单,开始先算在区间 [L,R] 内的幸运数字应该不算太难,利用容斥原理,奇加偶减,答案为 ans但是都不满足被不幸运数字整除就有点困难了,如果一个数 x 不能被任意一个不幸运数字整除,那么 x 一定不能被不幸运数字的 lcm 所整除,然后对于每一个幸运数字的倍数 t*a[i,j,k](t 为倍数) 与 lcm 的最小公倍数,...原创 2020-11-09 09:10:04 · 273 阅读 · 0 评论 -
POJ 1091 跳蚤(质因数分解+容斥原理+思维)
这个题挺考验思维的这个题目需要转化一下题意,假设有 n 张卡片由于向左向右并没有什么区别,所以题目可以转化为: a[1]*x[1]+a[2]*x[2]+……a[n]*x[n]+m*x[n+1]=1那么需要 gcd(a[1],a[2],……a[n],m) =1 才能满足题意,……(可能很多大佬一眼就能看出来,但是还是证明一下吧)证:当 gcd(a[1],a[2],……a[n],m) != 1 时, 方程两边可以同时除以 gcd,即方程变为: a[1]/gcd*x[1]+a[2]/gc...原创 2020-11-07 12:05:38 · 282 阅读 · 0 评论 -
HDU 4135 Co-prime(容斥原理+质因数分解)
求在一个区间 [a,b] 内,有多少个数与 n 互质将 n 质因数分解,利用容斥原理求解在 [1,a-1] , [1,b] 中有多少个数可以被 n 整除,剩下的数就是与 n 互质的数了 int i,j,k; ll n,m,t; //int a[N]; vector<int> prime;void get_factor(int n){ prime.clear(); for(int i=2;i*i<=n;i++)...原创 2020-11-07 10:45:44 · 193 阅读 · 0 评论 -
HDU 2841 Visible Trees(容斥原理+质因数分解)
有个人站在坐标 (0,0) 点处,从 (1,1) 开始有树,问在 (n,m) 的方格内,能看到多少棵树因为从原点看去,我们可以想象成一条正比例函数图像,即 y=kx ,当我们去看 (x,kx) 点时,会被 (x/gcd,kx/gcd) 的树所遮挡,所以我们只需要知道 gcd(x,y)=1 时的树有多少个即可就上述所说 gcd(x,kx)=1 时,当满足x=1 / k 不为整数的时候,而且当 x=1 时所可以看到的树,在 x=2 时不会再次看到,即不会有重复所以可以枚举 x ,对于...原创 2020-11-07 10:15:47 · 222 阅读 · 0 评论 -
HDU 2204 Eddy‘s爱好(容斥原理)
我觉得题目改成求有多少个 m ,可以写成 m^k<=n 比较好理解因为 n <=1e18 而 2^60>1e18 ,所以=1,在把指数变得更小就没有意义了所以打表素数到 60 为止因为 2*3*5*7>60 所以可知最多指数由三位质数组成所以先求出 n 最多可以承受的指数范围(即不变为 1 的指数范围)剩下的交给容斥就好了const int prime[18]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,5...原创 2020-11-05 18:31:46 · 116 阅读 · 0 评论 -
HDU 1796 How many integers can you find(容斥原理模板)
有 m 个数字,求 1~n-1 中有多少个数可以被这 m 个数字整除在一个区间 [1,n] 内,可以被 x 整除的数有 n/x 个,但是当有多个 xi 时,会有重合的部分,所以计算所选取的 x[] 的 lcm ,利用容斥原理,很容易解决const int N=3e5+5; int i,j,k; int n,m,t; int a[N];int main(){ IOS; while(cin>>n>>m){ ...原创 2020-11-05 17:01:55 · 157 阅读 · 0 评论 -
Nowcoder 20277 [SCOI2010]字符串(卡特兰数+组合数学)
题目一看就和卡特兰数有关,计算 即是最后的答案const ll mod=20100403;ll mul_mod(ll a,ll x,ll p){ ll ans=0; while(x){ if(x&1) ans=(ans+a)%p; a=(a+a)%p; x>>=1; } return ans;}ll pow_mod(ll a,ll x,ll p){ ll ans=1...原创 2020-10-30 12:24:41 · 231 阅读 · 0 评论 -
Codeforces Round #678 (Div. 2) C. Binary Search(二分+组合数学)
给出数 n ,也就是说有 0~n-1 随机排列,给出 x 以及 x 的位置 pos,问 :在 x 固定在 pos 的条件下,利用二分搜索能够找到 x 的数列的排列方式有几种其实一开始做这个题的时候,一点思路都没有,但是画了一下数轴差不多就可以想出来,大体思路利用二分查找,枚举位置 mid,如果 mid > pos ,说明 mid 位置的数必须大于 x,如果 mid < pos,那么mid 位置的数必须小于 x,最后将剩下的数随意排列即可但是注意到几个边界条件(这也是二分...原创 2020-10-26 23:27:41 · 285 阅读 · 0 评论 -
1652:牡牛和牝牛
这 n 头牛首先要确定有多少公牛,有多少母牛,如果有 i 头公牛,那么至少有(i-1)*k 头母牛,由于 p>n 所以直接做即可const ll mod=5000011;const int N=30+5; int n,m,t; int i,j,k; //int a[N];ll pow_mod(ll a,ll x,ll p){ ll ans=1; a%=p; while(x){ if(x&1) ans...原创 2020-10-24 12:21:41 · 607 阅读 · 0 评论 -
1650:组合
因为 n 的值很大,所以需要借助 lucas 定理进行化简,另外 jc 数组没法开到 p 的大小,所以不能采用预处理的方式ll pow_mod(ll a,ll x,ll mod){ ll ans=1; a%=mod; while(x){ if(x&1) ans=ans*a%mod; a=a*a%mod; x>>=1; } return ans;}ll C(ll n,ll m,l...原创 2020-10-24 10:57:27 · 257 阅读 · 0 评论 -
AcWing 211. 计算系数
求解 :由于 p =10007 为质数,所以用费马小定理,计算出 n! m! 的逆元求解即可const ll mod=10007;const int N=1000+5; int n,m,t; int i,j,k; //int a[N];ll pow_mod(ll a,ll x,ll mod){ ll ans=1; a%=mod; while(x){ if(x&1) ans=ans*a%mod; ...原创 2020-10-24 10:14:24 · 183 阅读 · 2 评论 -
卢卡斯定理
卢卡斯定理是用来解决排列组合问题中的一个问题先来看一下基础的知识原创 2020-10-22 23:40:23 · 1176 阅读 · 1 评论 -
CodeForces 630 I. Parking Lot(排列组合)
有 2*n-2 个车位 ,有 4 种车,车可以看作为无穷多,当且仅当 n 辆相同种类的车挨在一起时,老板会很开心,问有多少种方式让老板开心对于每种车而言:有 n 辆放在停车场的两端时,此时还剩 n-2 个位置,需要用另一种颜色的车将其分隔开,剩下的每个位子可以放任意的车 ,即 2(表示两端)*4*3*4^(n-3)当这 n 辆车不放在两端时,对于这 n 辆车有 n-3 个位置可以放, 在这 n 辆车的两端都要放置与其对应的不同颜色的车,此时还剩 n-4 个位置可以随便放,4*(n...原创 2020-10-17 16:15:40 · 245 阅读 · 1 评论 -
CodeForces 630 K. Indivisibility(容斥原理)
题目链接:http://codeforces.com/problemset/problem/630/K给出一个数,问再区间 [1,n] 中有多少个数不能被 [2,10] 中任意一个数整除只需要统计被 2,3,5,7 整除的即可,但是像 6 可以被 2,3 整除,所以根据容斥原理要减去那一部分int main(){ IOS; ll n; while( cin>>n ){ cout<<(n-n/2-n/3-n/...原创 2020-10-15 11:09:44 · 142 阅读 · 0 评论 -
POJ 3370 && HDU 1808 Halloween treats (鸽巢原理)
有 m 个小孩,n 个数,每个数代表糖果的数量,是否能够拿任意数量的糖果 sum,使得 sum%m==0 ,如果有输出下标 i(可能有多组输出样例,输出任意一种),不能的话输出 no sweetsconst int N=1e5+5; int n,m,t; int i,j,k; int a[N]; int sum[N] , pos[N]; void init(){ ms(sum,0); ms(pos,-1); sum[0...原创 2020-10-15 10:30:48 · 180 阅读 · 0 评论 -
POJ 2356 Find a multiple(鸽巢原理)
有 n 个数,现在让你从中取 m 个数,(m 可以自己任意给定),要求 m 个数的和为 n 的倍数,最后输出 m ,再按照数的大小,升序输出这 m 个数对初始数组排序后,求其前缀和对 n 取余,这样前缀和有 n 个数,根据鸽巢原理, 前缀和数组 sum[] 下标范围从 [0,n]这样一定有两个前缀和 sum[i] ,sum[j] 相等,这样这 m 个数就是 a[i+1,j] , 这 m 个数恰好可以被 n 整除const int N=1e4+5; int n,m...原创 2020-10-15 10:10:09 · 180 阅读 · 0 评论