质数分解

本文介绍了一种利用完全背包算法解决特定问题的方法,通过构建质数表并运用数学性质简化问题求解过程。
算法:模拟+DP
 
分析:挺好做的一道题,用一下完全背包。

      先弄个质数表,然后用刚好比它小的一个质数和之前的质数组成它就行了。 

program zhishufenjie;

const
 maxn=200;

var
 n,tot:longint;
 a,f,t:array [0..maxn] of longint;
 
procedure init;
var
 i,j:longint;
begin
 tot:=2;
 a[1]:=2;
 a[2]:=3;
 for i:=2 to 200 do
  begin
   for j:=2 to trunc(sqrt(i)) do if i mod j=0 then break;
   if (j=trunc(sqrt(i))) and (i mod j<>0) then
    begin
     inc(tot);
     a[tot]:=i;
    end;
  end;
end;

procedure main;
var
 i,j,m:longint;
begin
 fillchar(f,sizeof(f),0);
 f[0]:=1;
 for i:=1 to tot do
  begin
   if a[i]>n then
    begin
     m:=i-1;
     break;
    end;
   if ((a[i]<n) or (a[i]=n)) and (i=tot) then m:=tot;
  end;
 for i:=1 to m do
  begin
   for j:=a[i] to n do
   inc(f[j],f[j-a[i]]);
  end;
 t[n]:=f[n];
 writeln(f[n]);
end;

begin
 assign(input,'zhishufenjie.in'); reset(input);
 assign(output,'zhishufenjie.out'); rewrite(output);

 init;
 while not eof do
  begin
   readln(n);
   if t[n]=0 then main else writeln(t[n]);
  end;

 close(input); close(output);
end.




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值