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.

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

Hãy đọc nội quy trước khi bình luận.


Không có bình luận tại thời điểm này.