百韵网 >>  正文

Pascal 因式分解 将大于1的自然数N进行分解,满足N=A1*A2*……Am,求N的所有形式不同因式分解方案总数 pascal题:将大于1的自然数N进行因式分解,满足N=a1...

来源:www.baiyundou.net   日期:较早时间
题目只要求输出自然数N的分解方案数,当N大的时候分解方案数会相当的多,所以为了提高效率,可以不一一枚举所有的分解方案而是运用数学方法计算。
计算方法如下
首先对自然数N做质因数分解(分解成若干个质数的乘积)
设N的质因数分解为N=p1^q1 * p2^q2 * p3 ^q3 ...*pm ^ qm(比如当N=12时,N=2^2 * 3^1)
这样做之后,对N的分解就等价于将对质因子分组。
问题变成了:有m种物品,第i种物品有qi种,求将他们分成若干组的方案数。
设f[i][j]表示放了前i种物品,分了j组的方案数
转移的时候枚举一个k表示新增的组数
f[i][j+k] = f[i][j+k] + f[i-1][j] * C ( qi-k + j+k-1 , j+k-1 )
后面那个组合数是插板法,表示将 qi-k个本质相同的物品分到j+k个盒子里
分析一下复杂度,N最大为20亿,质因子个数是log级别的,大约为30,这样组数的枚举上限就为30,质因子种类显然也是log级别
复杂度为 30*30*30 = 27000,当然,由于方案数非常巨大,可能需要使用高精度存储,所以还要乘上高精度复杂度。
(最近转了C++,要代码的话可以给C++的吗?)

pascal题:将大于1的自然数N进行因式分解,满足N=a1*a2*a3…am 编一程序,对任意的自然数N, 求N的所有形式不~

var
n,t:longint;
procedure dfs(a,j:longint);
var
i:longint;
begin
if a=1 then t:=t+1;
for i:=j to a do
if a mod i=0 then
dfs(a div i,i);
end;
begin
read(n);
dfs(n,2);
writeln(t);
end.

之前写过一个类似的,你稍微改改就可以了

呵呵其实是跟数学有关的问题,你要用计算机做的就是将输入的数分解为若干个质数相乘,用递归的思路。
首先,一个数n的最大的质因数绝不超过根号n,也就是说,你可能得到的最大质因数为44721
用x数组装得到的不同的质因数,用y数组装第i个质因数的个数
用m记当前不同质因数的个数
那么分解完以后,你要做的就是将y数组里的每一个数加1,然后将它们全部相乘
这是利用排列组合的思想得到的

如果需要程序的话跟我说吧,以上是你要的思路

相关要点总结:
(编辑:本站网友)
相关推荐
关于我们 | 客户服务 | 服务条款 | 联系我们 | 免责声明 | 网站地图
@ 百韵网