回 帖 发 新 帖 刷新版面

主题:[讨论]一个数因式分解问题

因式分解:将大于1的自然数进行因式分解,输入N(<=2000000000),求N的所有形式不同的因式分解方案总数。(希望能减少搜索量,优化程序)
例如:12分解的方案总数为8。
  12=12  , 12=6*2  , 12=4*3 , 12=3*4,  12=3*2*2,12=2*6 , 12=2*3*2,  12=2*2*3
输入:一行整数N , 如12, 
输出:输出一行整数,如 8

最大数据1073731824
答案245728

如果用普通的:
procedure try(n:longint);
var 
  i:longint;
begin
  s:=s+1;                       {s初始为0}
  for i:=2 to n-1  do
    if n mod i=0 then try(n div i);
end;
只能出4个点..
请问如何做能出8个点?

回复列表 (共4个回复)

沙发

用动态规划
用f[i,j]表示把i分解,其中所有因数不大于j的方案数

板凳

请问能否更详细地讲一下..
动态规划转移方程怎么写?

3 楼

F[i,j]=total(F[x,y])
枚举x,符合以下条件:
x<i
x<j
i mod x=0
y=i div x

4 楼

program yinshifenjie;
var
    a:array[1..10000]of longint;
    j,k:longint;
function fenjie(n:longint):longint;
    var
        sum,i:longint;
    begin
        sum:=0;
        if a[n]=0 then        
            begin
                for i:=1 to (n div 2) do
                    if (n mod i)=0 then
                        sum:=sum+fenjie(i);    
                a[n]:=sum;
            end
        else
            sum:=a[n];            
        fenjie:=sum;
    end;
begin
    readln(k);
    a[1]:=1;
    j:=fenjie(k);
    writeln(j);
    readln;
end.

我来回复

您尚未登录,请登录后再回复。点此登录或注册