算数基本定理+容斥原理(的应用)

算术基本定理(唯一分解定理)

一句话:
    
任何大于1的自然数,都可以唯一分解成有限个质数的乘积

一、求一个数有几个因子。比如求9有3个因子,就是1、3、9,  原因是1*9=9  3*3=9

这种方法一般都会超时

C语言的代码如下:

//求一个数有几个因子
#include<stdio.h>
#include<math.h>
int num(int n)
{
	if(n==1) return 1;
	int count=2;
	for(int i=2;i*i<=n;i++)
	{
		if(n%i==0)
		{
			if(i*i==n&&n/i==i)//如果两因子相同,则加1 
				count++;
			else count+=2; 
		}
	}
	return count;
}
int main()
{
	int n;
	scanf("%d",&n);
	printf("%d\n",num(abs(n)));//以防是负数,带上abs() 
	return 0;
}

二、求一个数的所有因子(不包括自身)的和

这种方法一般都会超时

//求一个数的所有因子(不包括自身)的和
#include<stdio.h>
int sum(int x)
{
	int count=0;
	for(int i=1; i<=x/2; i++)//循环判断条件是 <=x/2 而不是 <x,因为比x/2大的数是成不了因子的
	{
		if(x%i == 0)
		{
			count += i;
		}
	}
	return	count;
}
int main()
{
	int n;
	while(~scanf("%d",&n))
		printf("%d\n",sum(n)); 
	return 0;
}

例题  求小于n且和n互质的数有多少个  n<=1 000 000 000

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+5;
int v[maxn];
int main()
{
	int t,n;
	while(scanf("%d",&t)&&t)
	{
		int ss=1;n=t;
		for(int i=2;i*i<=t;)
		{
			bool flag = false;
			while(t%i==0)
			{
				if(!flag)
				{
					flag=true;
					v[ss++]=i;
				}t/=i;
			}
			if(i==2) i++;
			else i += 2;
		}
		
	
		ll sum=0;
		if(t!=1) v[ss++]=t;
		ss-=1;
		for(int i=1;i<(1<<ss);i++)
		{
			ll cnt=0,tmp = 1;
			for(int j=1;j<=ss;j++)
			{
				if(i>>(j-1)&1)
				{
					cnt++;
					tmp=tmp*v[j];
				}
			}
			if(cnt&1) sum+=n/tmp;
			else sum-=n/tmp;
		}
		printf("%d\n",n-sum);
	}
return 0;
} 

猜你喜欢

转载自blog.csdn.net/vp_death_note/article/details/81203030