组合数学部分知识点

数学
1.质数,log,二分,题设证明
2.容斥原理 错排公式
3.与一个数a互质,必然是c+ka,c为a以内与a 互质的数字。Happy 2006
4.对于任意的整数n,必然存在一个由不多于两个的数来组成的一个倍数。因为a,aa,aaa……取n+1个,则必有两个模n余数相同,相减即得n的倍数m。而m只由a、0组成。5.对于大的数字,一般用同模定理缩减规模 (a+b)%m=a%m+b%m,(a*b)%m=a%m*b%m

组合数学
加法乘法原理 分类,分步
错排公式 D(n) = (n-1) [D(n-2) + D(n-1)]
第一步,把第n个元素放在一个位置,比如位置k,一共有n-1种方法;
第二步,放编号为k的元素,这时有两种情况:⑴把它放到位置n,那么,对于剩下的n-1个元素,由于第k个元素放到了位置n,剩下n-2个元素就有D(n-2)种方法;⑵第k个元素不把它放到位置n,这时,对于这n-1个元素,有D(n-1)种方法;

证明:已知n + 1个正整数,它们全都小于或等于2n,证明当中一定有两个数是互质*的。

假设有n个盒子,在第1个盒子中放1和2、在第2个盒子中放3和4、在第3个盒子中放5和6、……、在第n个盒子中放2n - 1和2n。

若从在这n个盒子中随意抽出n + 1个数,其中最少有一个盒子的两个数均会被抽出。由此,可知这n + 1个数中必定有一对连续数,而明显地连续数是互质的。


/*
Sky Code
求得是n个数中,有多少组(a,b,c,d)的公约数为1,值得注意的是这四个数不一定两两互质。  
所以我们从它的反面考虑,先求出公约数不为1的个数。  
思路:把每个数素数分解,记录不重复素因子所能组成的因子,把这些因子的总数统计,并且统计每个因子是由多少个素因子组成  
如这n个数中含2的个数为a,含3的个数为b,含6的个数为c,那么公约数大于1的总数为p=c(a,4)+c(b,4)-c(c,4),总的个数为c(n,4)  
用c(n,4)-p即为所求
*/

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAXN 10000+100

__int64 A[MAXN];
__int64 B[MAXN];
__int64 C[MAXN];
__int64 P[MAXN];
__int64 N;
__int64 num;
__int64 yz;

void dfs()
{
	__int64 i,j;
	__int64 temp,k;

	yz=0;
	for(i=2;i*i<=num;i++)
	{
		if(num%i==0)
		{
			C[yz++]=i;
			while(num%i==0)
				num/=i;
			
		}
	}
	if(num>1) C[yz++]=num;//C中存放质因子
	for(i=1;i<(1<<yz);i++)
	{
		k=0;temp=1;//排列组合所有质因子,组合成的因子。每一位代表一个因子的C中下标
		for(j=0;j<yz;j++)
			if(i&(1<<j))//判断有哪位就相乘
			{
				k++;
				temp*=C[j];
			}
		B[temp]++;//记录这个因子有多少个
		A[temp]=k;//记录这个因子由几个质因子组成
	}
	
}

int main()
{
	__int64 i;
	__int64 ans;
	memset(P,0,sizeof(A));
	for(i=4;i<MAXN;i++)
	{
		P[i]=i*(i-1)*(i-2)*(i-3)/24;
	}
	while(scanf("%d",&N)!=EOF)
	{
		memset(B,0,sizeof(A));
		
		for(i=0;i<N;i++)
		{
			scanf("%d",&num);
			dfs();
		}
		ans=0;
		for(i=2;i<MAXN;i++)
			if(B[i])//容斥原理,奇相加。偶相减
			{
				if(A[i]%2)    
					ans+=P[B[i]];
				else           
					ans-=P[B[i]];
			}
		ans=P[N]-ans;
        printf("%I64d\n",ans);
		
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值