1樓:匿名使用者
型別:搜尋
題解:本題動態規劃無從下手,也無數學公式可尋,看來只能搜尋(組合的生成演算法),其實1<=n<=20這個約束條件也暗示我們本題搜尋是有希望的,組合的生成可用簡單的dfs來實現,既搜尋這k個整數在原數列中的位置,由於組合不同於排列,與這k個數的排列順序無關,所以我們可以令a[i]1)是否為素數最簡單的方法就是看是否存在一個素數a(a<=sqrt(p))是p的約數,如果不存在,該數就為素數,由於在此題中1<=xi<=5000000,n<=20,所以要判斷的數p不會超過100000000,sqrt(p)<=10000,因此,為了加快速度,我們可以用篩選法將2…10000之間的素數儲存到一個陣列裡(共1229個),這樣速度估計將提高5~6倍。
特別注意:本題是要求使和為素數的情況有多少種,並不是求有多少種素數,比賽時就有很多同學胡亂判重而丟了12分;還有1不是素數,在判素數時要對1做特殊處理。
標程:pascal
program c2;
const
maxn = 20;
varn, m, i: byte;
ans, s: longint;
x: array[1 .. maxn] of longint;
f: array[1 .. 10000] of byte;
p: array[1 .. 1229] of integer;
procedure get_prime;
vari, j, s: integer;
begin
s := 0;
f[1] := 0;
for i := 2 to 10000 do f[i] := 1;
for i := 2 to 10000 doif f[i] = 1 then
begin
inc(s); p[s] := i;
j := 2 * i;
while j <= 10000 do begin f[j] := 0; inc(j, i) end;
endend;
procedure work(s: longint);
vari: integer;
begin
if s <= 10000 then inc(ans, f[s])else
begin
i := 1;
while sqr(longint(p[i])) <= s dobegin
if s mod p[i] = 0 then exit;
inc(i)
end;
inc(ans)
endend;
procedure search(d, pre: byte);
vari: byte;
begin
for i := pre + 1 to n - (m - d) dobegin
inc(s, x[i]);
if d = m then work(s)else search(d + 1, i);
dec(s, x[i])
endend;
begin
readln(n, m);
for i := 1 to n do read(x[i]);
ans := 0; s := 0;
get_prime;
search(1, 0);
writeln(ans)
end.
一個神牛的題解.......
求noip08普及組複賽《選數》的源程式(pascal語言)
2樓:匿名使用者
選數是noip2002普及的第二題,附我的程式,我們學校的題庫:http://pingce.ayyz.cn:9000
望採納!!!
varx:array[1..20]of longint;
n,k,i,j,total:integer;
y:array[1..500]of boolean;
procedure find(left,now,all:integer);
begin
if left>n-now+1 then exit;
if (left=0)and(now>n)then
begin
if y[all] then inc(total);
exit;
end;
find(left,now+1,all);
if left>0 then
find(left-1,now+1,all+x[now]);
end;
begin
readln(n,k);
for i:=1 to n do
read(x[i]);
fillchar(y,sizeof(y),true);
y[1]:=false;
for i:=2 to 500 do
if y[i] then
for j:=2 to 500 div i do y[i*j]:=false;
find(k,1,0);
writeln(total);
end.
3樓:o逸水之寒
我沒有影響有這道題目啊!
pascal程式設計:數字遊戲
4樓:匿名使用者
不一定是最優,僅提供一種思路 !
vara:array[1..15,1..15] of integer;
p,d,d0:array[1..15] of integer;
b:array[1..15] of boolean;
i,j,n:integer;
sum:integer;
find:boolean;
function s:integer;
vari,j:integer;
begin
for j:=1 to n do a[1,j]:=d[j];
for i:=2 to n do
for j:=1 to n-i+1 do
a[i,j]:=a[i-1,j]+a[i-1,j+1];
s:=a[n,1];
end;
procedure pailie(x:integer);
varm:integer;
begin
if x>n then begin
if s=sum then begin
for m:=1 to n do write(d[m]:3);
writeln;
find:=true;
end;
end else for m:=1 to n doif (not b[m])and(not find) then begin
d0:=d;
d[x]:=p[m];
b[m]:=true;
pailie(x+1);
b[m]:=false;
d:=d0;
end;
end;
begin
n:=12;
sum:=13312;
find:=false;
for i:=1 to n do begin p[i]:=i; b[i]:=false; end;
pailie(1);
end.
pascal程式
5樓:匿名使用者
program zaoshu;
vara:array[1..9] of integer; //存放自然數按位分解的各位數
b:array[1..10000] of longint; //存放位置調整後的每個數
c,sum:longint; //自然數
i,j,k,n:integer; //i,j,n為迴圈變數;k為找到的大數的個數
l,m,code,temp:integer; //l為串長;m位某位數字
t:longint; // t、temp為中間變數
st,st1:string; //st為自然數對應的串;st1為串中單個字元
find:boolean;
begin
readln(c);
str(c,st);
while st[1]=' ' do st:=copy(st,2,length(st)-1);
l:=length(st);
for i:=1 to l do begin //將自然數分解到陣列a中
st1:=copy(st,i,1);
val(st1,m,code);
a[i]:=m;
end;
k:=1; // 找相對大的數,並將找到的數放入陣列b中
//改用氣泡排序,且從末位往高位計算
for i:=l downto 2 do
for j:=l downto 2 do begin
if a[j-1]c then begin writeln(b[i]); find:=true; exit; end;
end;
if not find then writeln('no found !');
end.
6樓:匿名使用者
這一題考查的是數字的全排列,當然這是窮舉的辦法,就是將所有的數字排列可能全部列出來然後排序,找出比原數字大,又是所有可能中最小的數字,在沒有資料範圍要求的情況下這種方法最多隻能算六七位的數字。 需要源**的話可以說一聲,本人正在趕製······ 求採納
free pascal程式設計:給出n個數,你要將這n個數從小到大排序輸出,源程式如下,只需解釋。
7樓:匿名使用者
vara:array[1..10] of longint;
i,j,t,n:longint;
max:longint;
begin
readln(n);
for i:=1 to n do
read(a[i]);
for i:=1 to n-1 do beginmax:=i; {先假設下標為i的元素為最大}for j:
=i+1 to n do if a[j]>a[max] then max:=j;
if max<>i then
begin
t:=a[i]; a[i]:=a[max]; a[max]:=t;
end;
end;
for i:=1 to n do
writeln(a[i]);
end.
pascal程式問題
1.輾轉相除法 用來求公約數 2.整個程式 把每個數除以公約數後得到的都是素數,若是素數就停止。最後的相乘然後又除以5 好像是求相乘後5的倍數的有幾個。不是太懂 輾轉相除法 設兩數為a b b a 求它們最大公約數 a b 的步驟如下 用b除a,得a bq.r 1 0 r 若r1 0,則 a,b b...
求pascal精簡的堆排序演算法程式
孩子,用快排吧 這是最快的 程式1 program kspv const n 7 type arr array 1.n of integer vara arr i integer procedure quicksort var b arr s,t integer var i,j,x,t1 integ...
那位高手告訴下Pascal語言中讀程式裡的各種符號和字母(單
pascal語言中的運算子及其優先順序 單目運算子 最高優先順序 取變數或函式的地址 返回一個指標 not 邏輯取反或按位取反 乘除及按位運算子 相乘或集合交集 浮點相除 div 整數相除 mod 取模 整數相除的餘數 as 程式執行階段型別轉換 rtti運算子 and 邏輯或按位求和 shl 按位...