[问题描述]
任何大于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...
|