唯一分解定理:
任意一个正整数,都可以分成有限个素数的乘积形式
没错,这就是核心,短叭?
例如:48 = 2 * 2 * 2 * 2 * 3,54 = 2 * 3 * 3 * 3。
唯一分解定理推论:
根据分解过后的质因子种类及其个数能推出这个数有多少个因子
如:上述48 = 2 * 2 * 2 * 2 * 3 = 2^4 * 3^1
其因子数就为(4+1) * (1+1) 就是根据组合数学来推的,2的个数有0 -到 4种选法,3的个数有 0 到 1种选法
54 = 2^1 * 3^3
因子数为:(1+1) * (3+1)
代码实现把一个数分解成若干素数的乘积形式:
int n;
for(int i = 2;i * i <= n;i++)
{
if(n % i == 0)
{
arr[++m] = i;//这里的++m与m++是有区别的,不然,你试试?如果是m++,下面的num[m]就该改成num[m-1]了;
while(n % i == 0)
{
num[m]++;
n /= i;
}
}
}
if(n > 1)//如果n等于1了,说明还剩下了一个质数
{
arr[++m] = n;
num[m]++;
}
//arr数组存素数,num存这个素数的数量
是的,在博主的理解下,对解题有帮助的就是这一句核心。是不是觉得没用?那你就错了,虽然博主数学很差,编程也菜,但是在经历几个数论题的摧残后,就觉得这句话很有用了,光知道个定理是没有多大用的,来实战叭。
例题
牛客竞赛:阶乘
如果有兴趣也可以看看博主的这篇题解,其中还有这个定理的引论(我觉得算是引论叭。。嘻嘻)
题解
cf的题
目前我只记得了这俩个题。