质数和分解

[问题描述]
任何大于1 的自然数n都可以写成若干个大于等于2且小于等于n的质数之和表达式(包括只有一个数构成的和表达式的情况),并且可能有不止一种质数和的形式。例如,9的质数和表达式就有四种本质不同的形式:
9=2+5+2=2+3+2+2=3+3+3=2+7。
这里所谓两个本质相同的表达式是指可以通过交换其中一个表达式中参加和运算的各个数的位置而直接得到另一个表达式。
试编程求解自然数n可以写成多少种本质不同的质数和表达式。

[输入]
一行存放一个自然数n(2<n<2000)。
[输出]
输出自然数n的本质不同的质数和表达式的数目。

[输入]
200
[输出]
9845164

时间限制 Time Limitation 
 每个测试点3秒

题解:

似乎是安徽省选2001?

高精Plus+DP

Code:

 1 Var
 2   f:Array[0..2001] of Boolean;
 3   ff:Array[0..2001] of String;
 4   p,c:array[0..305] of longint;
 5   i,j,n,m:longint;
 6 Function Plus(a,b:STRing):STring; //高精度加法,写的有点儿复杂,但思想很简单..
 7   Var
 8     DC,i,Tt,la,lb:longint;
 9     st:String;
10   Begin
11     la:=Ord(a[0]);
12     lb:=Length(b);
13     if la>lb Then
14     Begin
15       For i:=1 to la-lb do
16         b:='0'+b;
17       lb:=la;
18     End
19     Else
20       Begin
21         For i:=1 to lb-la do
22           a:='0'+a;
23         la:=lb;
24       End;
25     For i:=1 to la do
26       c[i]:=Ord(a[i])+Ord(b[i])-96;
27     DC:=0; Tt:=0;
28     For i:=la Downto 1 do
29       if (c[i]+DC)>=10 Then
30         Begin
31           Tt:=(c[i]+DC) Mod 10;
32           DC:=(c[i]+DC) Div 10;
33           c[i]:=Tt;
34         End
35       Else
36         Begin
37           c[i]:=c[i]+DC;
38           DC:=0;
39         End;
40     c[0]:=-1;
41     if DC>0 Then c[0]:=DC;
42     st:='';
43     For i:=0 to la do
44       if c[i]<>-1 Then st:=st+Chr(c[i]+48);
45    // Writeln(st,' ',a,' ',b);
46     Plus:=st;
47   End;
48 Procedure Get_Prime(n:longint);  //筛法(是吧?)求素数
49   Var
50     i,j:longint;
51   Begin
52     FillChar(f,SizeoF(f),True);
53     f[1]:=False;
54     For i:=2 to Trunc(Sqrt(n)) do
55       if f[i] Then
56         Begin
57           j:=2*i;
58           While j<=n do //j<=n...(555...)
59             Begin
60               f[j]:=False;
61               j:=j+i;
62             End;
63         End;
64   End;
65 Begin
66   Readln(n);
67   Get_Prime(n);
68   For i:=2 to n do if f[i] Then Begin Inc(m); p[m]:=i; End;
69   For i:=1 to 1111 do ff[0]:='0';
70   ff[0]:='1';
71   For i:=1 to m do
72     For j:=0 to n-p[i] do
73       ff[j+p[i]]:=Plus(ff[j+p[i]],ff[j]);
75   Writeln(ff[n]);
76 End.
77 //由于Get_Prime()的原因WA了后,又发现2000 Int64爆了,so...
78 //正好最近打了高精的加减乘,so...

 

 

 
编译通过...
测试数据1:答案正确... 0ms
测试数据2:答案正确... 0ms
测试数据3:答案正确... 0ms
测试数据4:答案正确... 0ms
测试数据5:答案正确... 0ms
测试数据6:答案正确... 0ms
测试数据7:答案正确... 0ms
测试数据8:答案正确... 0ms
测试数据9:答案正确... 0ms
-------------------------
Accepted 有效得分:100 有效耗时:0ms

转载于:https://www.cnblogs.com/Catch-22/archive/2012/11/05/2755619.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值