Hướng dẫn giải của Sum of Primes
Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.
Lưu ý: Các code mẫu dưới đây chỉ mang tính tham khảo và có thể không AC được bài tập này
Code mẫu của flashmt
const max=11000; var a:array[2..max] of byte; b:array[0..2000] of integer; d:array[1..max] of byte; n:integer; procedure init; var i,j,k:integer; begin fillchar(a,sizeof(a),0); k:=trunc(sqrt(max)); for i:=2 to k do if a[i]=0 then begin j:=i*i; while j<=max do begin a[j]:=1; j:=j+i; end; end; fillchar(b,sizeof(b),0); for i:=2 to max do if a[i]=0 then begin inc(b[0]); b[b[0]]:=i; end; fillchar(d,sizeof(d),0); for i:=1 to b[0] do begin k:=b[i]; inc(d[k]); for j:=i+1 to b[0] do begin k:=k+b[j]; if k<=max then inc(d[k]) else break; end; end; end; begin init; readln(n); while n<>0 do begin writeln(d[n]); readln(n); end; end.
Code mẫu của happyboy99x
#include<cstdio> #include<cstring> #define N 11000 int pr[N], f[N], cnt; bool prime[N]; void eratos() { memset(prime, -1, sizeof prime); for(int i = 2; i * i <= N; ++i) if(prime[i]) for(int j = i+i; j <= N; j += i) prime[j] = 0; for(int i = 2; i <= N; ++i) if(prime[i]) pr[cnt++] = i; } void calc() { for(int i = 0; i < cnt; ++i) for(int j = i, sum = pr[i]; j < cnt && sum <= N; sum += pr[++j]) ++f[sum]; } int main() { eratos(); calc(); for(int n; scanf("%d", &n) != EOF && n != 0; printf("%d\n", f[n])); return 0; }
Code mẫu của ladpro98
program mprime1; uses math; const fi=''; var a:array[0..5000] of longint; sieve:array[1..11000] of boolean; d,res,i,n:longint; inp:text; procedure initSieve; var i,j:longint; begin i:=2; fillchar(sieve,sizeof(sieve),true); for i:=2 to 11000 do begin if not sieve[i] then continue; sieve[i]:=true; j:=i+i; while j<=11000 do begin sieve[j]:=false; inc(j,i); end; end; end; procedure InitA; var i,j:longint; begin d:=0; for i:=2 to 11000 do begin if sieve[i] then begin inc(d); a[d]:=i; end; end; for i:=2 to d do a[i]:=a[i-1]+a[i]; end; function find(last,key:longint):boolean; var l,r,m:longint; begin l:=0; r:=last; while l<=r do begin m:=(l+r) div 2; if a[m]=key then exit(true); if a[m]<key then l:=m+1 else r:=m-1; end; exit(false); end; begin initSieve; initA; assign(inp,fi); reset(inp); while not eof(inp) do begin readln(inp,n); if n=0 then break; res:=0; for i:=1 to d do if find(i-1,a[i]-n) then inc(res); writeln(res); end; end.
Code mẫu của RR
{$R+,Q+} {$Mode objFPC} uses math; const FINP=''; FOUT=''; MAXN=11000; var f1,f2:text; p:array[0..2000] of longint; count,sum:array[1..2000000] of longint; sl,n,m:longint; procedure openF; begin assign(f1,FINP); reset(f1); assign(f2,FOUT); rewrite(f2); end; procedure closeF; begin close(f1); close(f2); end; function nt(n:longint):boolean; inline; var i,gh:longint; begin gh:=trunc(sqrt(n)); for i:=2 to gh do if n mod i=0 then exit(false); exit(true); end; procedure swap(var a,b:longint); inline; var temp:longint; begin temp:=a; a:=b; b:=temp; end; procedure sort(l,r:longint); inline; var i,j,mid:longint; begin i:=l; j:=r; mid:=sum[l+random(r-l+1)]; repeat while sum[i]<mid do inc(i); while sum[j]>mid do dec(j); if i<=j then begin swap(sum[i],sum[j]); inc(i); dec(j); end; until i>j; if i<r then sort(i,r); if l<j then sort(l,j); end; procedure init; var first,last,i,j:longint; begin for i:=2 to 11000 do if nt(i) then begin inc(sl); p[sl]:=i; end; for i:=2 to sl do p[i]:=p[i-1]+p[i]; m:=0; for first:=1 to sl do for last:=first to sl do begin inc(m); sum[m]:=p[last]-p[first-1]; end; sort(1,m); j:=1; count[1]:=1; for i:=2 to m do if sum[i]>sum[j] then begin inc(j); sum[j]:=sum[i]; count[j]:=1; end else inc(count[j]); m:=j; end; function get(key:longint):longint; var kq,l,r,mid:longint; begin kq:=0; l:=1; r:=m; repeat mid:=(l+r)>>1; if sum[mid]<=key then begin kq:=mid; l:=mid+1; end else r:=mid-1; until l>r; if sum[kq]<>key then exit(0) else exit(count[kq]); end; begin openF; init; read(f1,n); while (n>0) do begin writeln(f2,get(n)); read(f1,n); end; closeF; end.
Code mẫu của hieult
#include <stdio.h> //#include <conio.h> #include <math.h> main() { long n[5000],t=2,N; n[1]=2; n[2]=3; for(long i=4;i<11000;i++) { int k=0; for(long j=1;j<=t;j++) { if(i%n[j]==0) { k=1; break; } else if(n[j]>sqrt(i)) break; } if(k==0) { t++; n[t]=i; } } do { scanf("%ld",&N); if(N==0) break; long x=0,Dem=0; for(int i=1;i<=t;i++) { if(n[i]>N) break; else { x=n[i]; for(int j=i+1;j<t;j++) { if(x>N) break; else if(x==N) { Dem++; break; } x+=n[j]; } } } printf("%ld\n",Dem); }while(1); //getch(); }
Code mẫu của ll931110
Program MPRIME1; Var check: array[2..11000] of boolean; a,b: array[1..11000] of integer; n,num: integer; Procedure Eratostene; Var i,k: integer; Begin Fillchar(check, sizeof(check), true); For i:= 2 to trunc(sqrt(11000)) do Begin k:= 2 * i; While k <= 11000 do Begin check[k]:= false; k:= k + i; End; End; End; Procedure primearray; Var i: integer; Begin num:= 0; For i:= 2 to 11000 do if check[i] then Begin inc(num); a[num]:= i; End; End; Procedure counting; Var i,k,sum: integer; Begin Fillchar(b, sizeof(b), 0); For i:= 1 to num do Begin sum:= a[i]; k:= i; While (sum <= 11000) and (k <= num) do Begin inc(b[sum]); inc(k); sum:= sum + a[k]; End; End; End; Procedure printresult; Begin Repeat Readln(n); If n <> 0 then writeln(b[n]); Until n = 0; End; Begin Eratostene; primearray; counting; printresult; End.
Code mẫu của skyvn97
#include<stdio.h> #define MAX 11111 int s[MAX]; bool pr[MAX]; int n,c; int np; void eratosthene(void) { int i,j; np=0; s[0]=0; pr[0]=true; pr[1]=true; for (i=2;i<MAX;i=i+1) if (!pr[i]) { np++; s[np]=s[np-1]+i; for (j=2*i;j<MAX;j=j+i) pr[j]=true; } } int bs(int l,int r,int num,int val) { if (l>r) return (-1); if (l==r) { if (s[l+num-1]-s[l-1]==val) return (l); return (-1); } if (r-l==1) { if (s[l+num-1]-s[l-1]==val) return (l); if (s[r+num-1]-s[r-1]==val) return (r); return (-1); } int m=(l+r)/2; if (s[m+num-1]-s[m-1]==val) return (m); if (s[m+num-1]-s[m-1]>val) return (bs(l,m-1,num,val)); if (s[m+num-1]-s[m-1]<val) return (bs(m+1,r,num,val)); } void process(void) { c=0; int i; for (i=1;i<=np;i=i+1) c=c+(bs(1,np-i+1,i,n)>0); printf("%d\n",c); } int main(void) { eratosthene(); while (true) { scanf("%d",&n); if (n==0) return (0); process(); } }
Code mẫu của khuc_tuan
// {$APPTYPE CONSOLE} {$mode delphi} const maxn = 11000; var isPrime : array[0..maxn] of boolean; x, cur, nd, i, j : integer; ds : array[0..maxn] of integer; sum : array[0..maxn] of integer; begin fillchar(isprime, sizeof(isprime), true); isprime[0] := false; isprime[1] := false; for i:=2 to maxn do if isprime[i] then begin inc(nd); ds[nd] := i; j := i + i; while j <= maxn do begin isprime[j] := false; j := j + i; end; end; sum[0] := 0; for i:=1 to nd do sum[i] := ds[i] + sum[i-1]; while true do begin read(x); if x=0 then break; j := 0; cur := 0; for i:=1 to nd do begin if ds[i] > x then break; while sum[i] - sum[j] > x do inc(j); if (sum[i] - sum[j]) = x then inc(cur); end; writeln(cur); end; end.
Bình luận