c语言容斥原理求素数,容斥定理相关题目讲解
0918
<=1>=8的情况。
<=1X>=8Y组排列。那么通过容斥原理来解决就可以写成:
即:
二.
n0121次,这样的序列有多少种?
同样的,我们转向它的逆问题。也就是不出现这些数字的序列 不出现其中某些数字的序列。
Ai(i=0…2)i的序列数,那么由容斥原理,我们得到该逆问题的结果为:
可以发现每个Ai的值都为2^n(因为这些序列中只能包含两种数字)。而所有的两两组合
都110。(因为它不包含数字,所以不存在)
要记得我们解决的是它的逆问题,所以要用总数减掉,得到最终结果:
三.
方程整数解问题
给出一个方程:
其中
。
求这个方程的整数解有多少组。
我们先不去理会xi<=8的条件,来考虑所有正整数解的情况。这个很容易用组合数来求解,我们要把20个元素分成6组,也就是添加5块“夹板”,然后在25个位置中找5块“夹板”的位置。
然后通过容斥原理来讨论它的逆问题,也就是x>=9时的解。
我们定义Ak为xk>=9并且其他xi>=0时的集合,同样我们用上面的添加“夹板”法来计算Ak的大小,因为有9个位置已经被xk所利用了,所以:
然后计算两个这样的集合Ak、Ap的交集:
因为所有x的和不能超过20,所以三个或三个以上这样的集合时是不能同时出现的,它们的交集都为0。最后我们用总数剪掉用容斥原理所求逆问题的答案,就得到了最终结果:
四.
求指定区间内与n互素的数的个数:
nr[1;r]n互素的数的个数。
n互素的数的个数。
npi(i=1…k)
[1;r]pi整除呢?它就是:
然而,如果我们单纯将所有结果相加,会得到错误答案。有些数可能被统计多次(被好几个素因子整除)。所以,我们要运用容斥原理来解决。
我们可以用2^k的算法求出所有的pi组合,然后计算每种组合的pi乘积,通过容斥原理来对结果进行加减处理。
关于此问题的最终实现:
int solve (int n, int r)
{
vector p;
for (int i=2; i*i<=n; ++i)
if (n % i == 0)
{
p.push_back (i);
while (n % i == 0)
n /= i;
}
if (n > 1)
p.push_back (n);
int sum = 0;
for (int msk=1; msk
{
int mult = 1,
bits = 0;
for (int i=0; i
if (msk & (1<
{
++bits;
mult *= p[i];
}
int cur = r / mult;
if (bits % 2 == 1)
sum += cur;
else
sum -= cur;
}
return r - sum;
}
五.
素数四元组的个数问题
个数
,从其中选出4个数,使它们的最大公约数为1,问总共有多少中取法。
我们解决它的逆问题:求最大公约数d>1的四元组的个数。
运用容斥原理,将求得的对于每个d的四元组个数的结果进行加减。
其中deg(d)代表d的质因子个数,f(d)代表四个数都能被d整除的四元组的个数。
求解f(d)时,只需要利用组合方法,求从所有满足被d整除的ai中选4个的方法数。
然后利用容斥原理,统计出所有能被一个素数整除的四元组个数,然后减掉所有能被两个素数整除的四元组个数,再加上被三个素数整除的四元组个数…
六.
和睦数三元组的个数问题
。选出a,
b, c (其中2<=a
· 或者满足,
,
·或者满足
首先,我们考虑它的逆问题:也就是不和睦三元组的个数。
然后,我们可以发现,在每个不和睦三元组的三个元素中,我们都能找到正好两个元素满足:它与一个元素互素,并且与另一个元素不互素。
所以,我们只需枚举2到n的所有数,将每个数的与其互素的数的个数和与其不互素的数的个数相乘,最后求和并除以2,就是要求的逆问题的答案。
2n2n所有数的结果,分别求解显然效率太低。
2n所有数的结果。
在这里,我们可以使用改进的埃拉托色尼筛法。
·首先,对于2到n的所有数,我们要知道构成它的素数中是否有次数大于1的,为了应用容斥原理,我们还有知道它们由多少种不同的素数构成。
deg[i]igood[i]truefalsei1是否成立。
i2ndeg[]igood[]false。
·然后,利用容斥原理,求出2到n每个数的cnt[i]:在2到n中不与i互素的数的个数。
回想容斥原理的公式,它所求的集合是不会包含重复元素的。也就是如果这个集合包含的某个素数多于一次,它们不应再被考虑。
igood[i]=trueii*ji*jN/ii*jideg[i]deg[i]为奇数,那么我们要用加号,否则用减号。
程序实现:
int n;
bool good[MAXN];
int deg[MAXN], cnt[MAXN];
long long solve()
{
memset (good, 1, sizeof good);
memset (deg, 0, sizeof deg);
memset (cnt, 0, sizeof cnt);
long long ans_bad = 0;
for (int i=2; i<=n; ++i)
{
if (good[i])
{
if (deg[i] == 0) deg[i] = 1;
for (int j=1; i*j<=n; ++j)
{
if (j > 1 && deg[i] == 1)
if (j % i == 0)
good[i*j] = false;
else
++deg[i*j];
cnt[i*j] += (n / i) * (deg[i]%2==1 ? +1 : -1);
}
}
ans_bad += (cnt[i] - 1) * 1ll * (n - cnt[i] - 1);
}
return (n-1) * 1ll * (n-2) * (n-3) / 6 - ans_bad / 2;
}未完待续……
c语言容斥原理求素数,容斥定理相关题目讲解相关推荐
- 最简真分数c语言,HihoCoder1655 : 第K小最简真分数([Offer收割]编程练习赛39)(唯一分解+容斥定理+二分)(不错的数学题)...
描述 给一个整数N,请你求出以N为分母的最简(既约)真分数中第K小的是多少? 输入 两个整数N个K. 对于30%的数据,1 <= N <= 1000000 对于100%的数据,1 < ...
- 《程序设计中的组合数学》——容斥定理
在中学阶段的数学中,有诸如"一个班有7个语文满分,6个数学满分,5个英语满分--求满分的同学有多少个"的"多面手"问题,当时老师介绍的思路是画个图自己分配一下, ...
- 组合数学 —— 容斥定理
[概述] 容斥原理是一种较常用的计数方法,其基本思想是:先不考虑重叠的情况,把包含于某内容中的所有对象的数目先计算出来,然后再把计数时重复计算的数目排斥出去,使得计算的结果既无遗漏又无重复. 容斥原理 ...
- HDU-4059 The Boss on Mars 容斥定理
将与N不互质的数全部找出来,再应用容斥定理求得最后的结果.这题在求 a/b MOD c 的时候使用费马小定理等价于 a*b^c(-2) MOD c.用x/lnx 可以估计出大概有多少素数. 代码如下: ...
- hdu 1796 How many integers can you find 容斥定理
一开始看 这里 这个文章博主写得很好. 当举容斥定理的所谓 奇数为负 偶数为正的时候. 我直接就认为是 a*b 了.实际上是lcm(a,b). 由于博文中的因子都是互素的(素数之间).所以lcm(a, ...
- [acmm week12]染色(容斥定理+组合数+逆元)
1003 染色 Time Limit: 1sec Memory Limit:256MB Description 今天离散数学课学了有关树的知识,god_v是个喜欢画画的人,所以他 ...
- HDU 6143 Killer Names【容斥定理】【排列组合】
题目来戳呀 Problem Description Galen Marek, codenamed Starkiller, was a male Human apprentice of the Sith ...
- 二项式反演(广义容斥定理)学习笔记
背景: 二项式反演又名广义容斥定理. 下次再看题解时要注意了. 解锁新姿势. 说白了就是之前会的姿势太少了. 正题: 说白了就是有这样两条恒等的式子: f n = ∑ i = 0 n ( − 1 ) ...
- poj1091跳蚤(容斥定理)
题目: Z城市居住着很多只跳蚤.在Z城市周六生活频道有一个娱乐节目.一只跳蚤将被请上一个高空钢丝的正中央.钢丝很长,可以看作是无限长.节目主持人会给该跳蚤发一张卡片.卡片上写有N+1个自然数.其中最后 ...
- UVA-10212 The Last Non-zero Digit. 分解质因子+容斥定理
这个是参考了别人之后的代码,POJ上0MS过了.Orz......对于一个序列在提取了2,5之后,例如1,2,3,4,5,6,7,8,9,10,我们可以将其中的奇数和偶数分开来对待,对于偶数序列2,4 ...
最新文章
- SQL 与oracle数据同步之 链接服务器
- 变种 背包问题_动态规划入门——传说中的零一背包问题
- 二维傅里叶变换是怎么进行的?
- TabHost两种实现方式
- 使用AIR运行另外的程序。
- 工信部:支持符合条件的工业互联网企业上市
- linux安全策略查询代码,Linux多安全策略和动态安全策略框架模块代码分析报告(14)...
- 【前端应该知道的那些事儿】运动学基础
- html header设置语言,html5 header标签 html header css布局教程
- OpenGl读取导入3D模型并且添加鼠标移动旋转显示
- matlab 读取mdf文件路径,从 MDF 文件中读取数据
- 将android应用中产生arn的原因写到本地
- pnpm安装使用教程以及pnpm node版本管理以及EPERM operation not permitted symlink问题解决
- 腾讯企业邮箱免费申请 mail-tencent.com
- python金融风控评分卡模型
- 主题建模-corpora语料库-PCA进行降维
- mac在终端打开mysql_如何在Mac上打开终端
- lv双肩包尺寸对照表_最值得入手的10款LV双肩包包书包图片大全
- MATLAB的动态图,伪色彩图、矢量图、流线图,散点图折线图的绘制例子--流体力学;LBM
- mysql table crashed_快速解决MySQL:Table xxx is marked as crashed and should be repaired五个办法...