`
yzmduncan
  • 浏览: 330380 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

组合数学——容斥原理及其应用

阅读更多

    容斥原理是计数中常用的一种方法。在讨论容斥原理的过程中,要用到以下集合论的基本性质。

德摩根(De Morgan)定理

     若A和B是集合U的子集,则

 

例题

HDU4059 The Boss on Mars

题意:给一个数n(n=10^8),求X1^4+X2^4+..Xk^4的和模1,000,000,007,其中1<=Xi<n,且Xi与n互素。

解:

    四次方求和公式为:n*(n+1)*(2*n+1)*(3*n*n+3*n-1)/30

    将n分解素因子为p1^e1*p2^e2*..*pk^ek,设集合Ai为pi的整数倍的数的集合。则答案为U-|A1UA2U...UAk|。

    求|A1UA2U...UAk|即可用容斥原理求解。

    注意先求30在模1,000,000,007下的逆元。

时间复杂度分析:

    n为10^8,素因子分解最多有10个左右,容斥原理求解计算次数大约为2^10,复杂度已经很低了。

 

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <cmath>
using namespace std;
const int Max = 10005;
const int MOD = 1000000007;
int prime[Max],num=0;
bool isPrime[Max]={0};
int x,y,rev;
vector<int> factors;

void getPrime(int Max)
{
    int i,j;
    int t;
    for(i = 2; i < Max; i++)
    {
        if(!isPrime[i])
        {
            prime[num++] = i;
            for(j = 2; (t=i*j) < Max; j++)
                isPrime[t] = 1;
        }
    }
}

void extend_Euclid(int a, int b)
{
    if(b==0)
    {
        x = 1;
        y = 0;
        return;
    }
    extend_Euclid(b, a%b);
    int t = x;
    x = y;
    y = t - a/b*y;
}

void init()
{
    extend_Euclid(30,MOD);
    rev = (x%MOD+MOD)%MOD;
    getPrime(Max);
}

void decompose(int n)
{
    int t = (int)sqrt(n*1.0);
    for(int i = 0; i<num && prime[i]<=t; i++)
    {
        if(n%prime[i]==0)
        {
            factors.push_back(prime[i]);
            while(n%prime[i]==0)
                n = n/prime[i];
        }
    }
    if(n>1)
        factors.push_back(n);
}

__int64 getSum(__int64 n)
{
    __int64 result = n;
    result = result*(n+1)%MOD;
    result = result*(2*n+1)%MOD;
    result = result*(((n*n%MOD*3+3*n%MOD-1)%MOD+MOD)%MOD)%MOD;
    result = result*rev%MOD;
    return result;
}

__int64 getPow(__int64 n)
{
    return (n*n)%MOD*n%MOD*n%MOD;
}

__int64 in_out_principle(int start, __int64 n)
{
    int i;
    __int64 result = 0;
    for(i = start; i < factors.size(); i++)
    {
        int tmpt = factors[i];
        result = (result + getSum(n/tmpt)*getPow(tmpt)%MOD)%MOD;
        result = ((result - in_out_principle(i+1, n/tmpt)*getPow(tmpt)%MOD) + MOD)%MOD;
    }
    return result;
}

int main()
{
    int t;
    init();
    int n;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        factors.clear();
        decompose(n);
        printf("%I64d\n",((getSum(n)-in_out_principle(0,n))%MOD+MOD)%MOD);
    }
    return 0;
}

 

 

  • 大小: 8.9 KB
1
0
分享到:
评论
3 楼 kimmking 2012-02-12  
yzmduncan 写道
changedi 写道
什么时候集合论的东西到了数论领域了~~~

算是组合数学吧!



数论的范围比 组合数学大,也包括集合论中的很大一部分

2 楼 yzmduncan 2011-12-21  
changedi 写道
什么时候集合论的东西到了数论领域了~~~

算是组合数学吧!
1 楼 changedi 2011-12-21  
什么时候集合论的东西到了数论领域了~~~

相关推荐

    组合数学——卢开澄组合数学——卢开澄

    书中将组合数学分为六个章节进行介绍,分别是排列与组合、母函数与递推关系、容斥原理与鸽巢原理、贝努利特引理与波利亚定理、区组设计与编码、组合算法与复杂性分析。这六个部分构成组合数学的基础框架,并且每部分...

    容斥原理的简单应用.pptx

    容斥原理作为一种重要的组合数学工具,在计算机科学领域有着广泛的应用。无论是简单的计数问题,还是复杂的算法设计,合理运用容斥原理都能帮助我们更高效地解决问题。同时,与其他数学工具如拉格朗日插值、多项式等...

    组合数学(原书第4版)(美)Richard A. Brualdi

    第六章详细讨论了容斥原理及其应用,包括错位排列、禁止位置问题等。此外,还介绍了莫比乌斯反演原理作为容斥原理的推广。 递推关系和生成函数是组合数学中解决序列问题的重要工具。第七章介绍了线性齐次递推关系、...

    编程爱好者的组合数学训练——材料

    以下将详细介绍组合数学的一些核心知识点及其在编程中的应用。 1. **组合与排列**:组合是不考虑顺序的选择,例如从n个不同元素中选取k个,表示为C(n, k)或n选k。排列则是考虑顺序的选择,从n个不同元素中选取k个并...

    卢开澄《组合数学》(第三版)课后习题解答

    1. **容斥原理**:给出了加法原理和乘法原理的推广形式,即容斥原理,用于计算有重复元素的集合的基数。 2. **递推关系**:探讨了通过递推公式求解序列的方法,如斐波那契数列,以及线性同余方程的解法。 **第三章...

    ACM组合数学

    ### ACM组合数学——Nim博弈及相关知识点 #### 组合数学概述 组合数学是一门研究离散对象的计数、组合以及结构的数学分支。它不仅历史悠久,而且在现代计算机科学与信息技术领域扮演着极其重要的角色。组合数学的...

    组合数学与图论

    5. **容斥原理**:处理包含和排除特定元素集合的大小问题,是组合问题中的一个重要技巧。 6. **斯特林数**:分为第一类和第二类,常用于描述排列或组合的分解问题。 7. **组合恒等式**:如卡特兰数、卢卡斯数等,...

    离散数学及其应用习题解析

    - **典型问题**:鸽巢原理、容斥原理等。 #### 5. 逻辑学 逻辑学是研究推理有效性的学科,是计算机科学和人工智能的基础之一。 - **基本概念**:命题、命题逻辑、谓词逻辑等。 - **典型问题**:逻辑推理、命题...

    组合数学课后习题总结.rar

    5. **容斥原理**:计算同时满足多个条件的对象数量时,先累加所有条件的数量,然后逐个减去共同满足的条件的数量,直至考虑所有重叠部分。 6. ** Burnside引理**:在群作用下,固定点的数目可以通过计算每个群元素...

    CSP(NOIP)复习资料——数学知识.docx

    - **容斥原理**: 容斥原理的基本概念及其在组合计数中的应用。 - **生成函数**: 利用生成函数解决序列求和等问题。 ### 二、进阶技巧 #### 1. 矩阵与线性代数 - **矩阵的基本操作**: 加法、乘法、转置等。 - **...

    高中数学计数原理与概率、随机变量及其分布教案人教版(理科).docx

    对于更复杂的计数问题,可能需要结合其他计数技巧,如排列组合、容斥原理等。例如,题目3的羽毛球比赛,需要考虑不同局数下的胜败情况,这就涉及到分类和分步的综合运用。 总的来说,理解和熟练运用分类加法计数...

    Discrete Mathematics and Its Applications.zip

    二项式定理、鸽巢原理、容斥原理等是组合数学中的基本工具,它们在算法复杂度分析、概率计算和编码理论中有广泛应用。 5. **递归与归纳**:递归是计算机科学中解决问题的一种常用方法,而归纳则是证明方法。理解...

    优秀资料(2021-2022年收藏)小学六年级奥数基础知识——数论.doc

    这些是解决计数问题的基础工具,如加法原理和乘法原理用于组合事物的方法数,容斥原理处理重叠集合,排列组合涉及有序和无序的选择,枚举法是直接列举所有可能情况,归纳法是通过部分情况推导出整体规律。...

    IOI国家集训队论文集1999-2019

    符文杰 -《Pólya原理及其应用》 高 岳 -《中等硬度解题报告》 江 鹏 -《从一道题目的解法试谈网络流的构造与算法》 刘汝佳 -《搬运工问题的启示》 李益明 -《计算几何的相关问题》 李 源 -《树的枚举》 骆 骥...

    离散数学课件 精品

    4. **组合数学**:组合数学研究有限集合的组合性质,包括组合计数、排列、二项式定理、鸽巢原理、容斥原理等。这些工具在分析算法复杂度、计算概率以及设计高效算法时十分有用。 5. **初等数论**:数论研究整数的...

    离散数学试题(含答案).zip

    掌握容斥原理、鸽巢原理及其在计数问题中的应用。 6. **递归与归纳**:了解递归定义的概念,学习如何建立递归函数和解决递归问题。掌握归纳法在证明中的应用,尤其是数学归纳法。 7. **布尔代数**:布尔代数是...

    算法艺术与信息学竞赛课件

    "组合数学(一)"可能涉及鸽巢原理、容斥原理等基础理论,以及在信息学竞赛中如何应用这些原理解决问题。 "5-connectiveness.ppt"可能是关于图的连通性问题,如判断图是否连通、最小生成树、二分图等。 "数论(二)...

    高中数学公式大全[1].doc

    容斥原理是一种计算多个集合并集的方法,尤其适用于解决包含与排除的问题。其基本思想是先将各个集合的元素数目相加,然后减去重复计算的部分,再加入再次被重复减去的部分,以此类推,直到所有可能的重叠都被正确...

    大连市2012年ACM ICPC程序设计大赛 solution.pdf

    2. **素数分解**:对m进行素数分解,并应用容斥原理求解。 3. **结果输出**:输出最终求得的正整数解的数量。 #### I: 时间转换问题 **题目背景**:涉及时间的计算,需要注意数据类型的选取和闰年的处理。 **解题...

Global site tag (gtag.js) - Google Analytics