Problema #1295 CifPagini de pe pbinfo va rog!
Cerința
Într-o bibliotecă se află o carte cu o proprietate mai ciudată. Este alcătuită din n volume, și pentru fiecare fiecare volum numărul de pagini este număr prim. Mai mult, numerele paginilor volumelor sunt numere prime consecutive.
Se dau numerele n p v reprezentând numărul de volume ale cărții, numărul de pagini ale primului volum și numărul cerinței care trebuie rezolvate. Să se afle:
a) numărul total de pagini;
b) numărul total de cifre folosite pentru numerotarea paginilor celor n volume.
Date de intrare
Fișierul de intrare cifpagini.in conține pe prima linie numerele n p v reprezentând numărul de volume ale unei cărți, numărul de pagini ale primului volum și respectiv numărul cerinței.
Date de ieșire
Dacă v=1, fișierul de ieșire cifpagini.out va conține numărul nt , reprezentând numărul total de pagini.
Dacă v=2, fișierul de ieșire cifpagini.out va conține numărul np , reprezentând numărul total de cifre folosite pentru numerotarea paginilor celor n volume.
Restricții și precizări
1 ≤ n ≤ 1000
1 ≤ p < 50.000
v poate fi doar 1 sau 2;
Paginile volumelor se numerotează de la 1 la numărul total de pagini; dacă primul volum are k pagini, atunci volumul al doilea se va numerota cu k+1, ș.a.m.d.
Exemplul 1
cifpagini.in
3 103 1
cifpagini.out
319
Explicație
v=1, deci căutam următoarele n-1 numere prime reprezentând numărul de pagini al fiecărui volum; acestea sunt 107 și respectiv 109 pagini. 103 + 107 + 109 = 319
Exemplul 2
cifpagini.in
3 103 2
cifpagini.out
849
Explicație
v=2, deci căutam următoarele n-1 numere prime reprezentând numărul de pagini al fiecărui volum și calculăm suma lor (103+107+109=319). Numărul de cifre folosite în numerotarea celor 319 pagini este 849.
Răspunsuri la întrebare
Răspuns:
319
Explicație:
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("cifpagini.in");
ofstream g("cifpagini.out");
int n,p,v,S,x,t,k,a[1001],d,i,S1;
int main()
{
f>>n>>p>>v;
S+=p;
x=p+1;
while(k<=n-1)
{
if(x%2!=0){d=3;
t=1;
while(d*d<=x)
{if(x%d==0) t++;
d++;}
if(t==1) {++k;
a[k]=x;}}
x++;
}
for(i=1;i<=n-1;i++) S+=a[i];
if(v==1) g<<S;
else {p=1;
x=S;
k=0;
while(S)
{p*=10;
k++;
S/=10;
}
p/=10;
while(k)
{
S1+=k*(x-p+1);
k--;
x=p-1;
p/=10;
}
g<<S1;
}
return 0;
}
Răspuns:
#include <fstream>
using namespace std;
ifstream f("cifpagini.in");
ofstream g("cifpagini.out");
long long n,i,p,j,v[1000001],e,s;
int main()
{
for(i=0;i<=1000000;i++)
v[i]=0;
v[1]=1;
v[0]=1;
for(i=2;i<=1000000/i;i++)
if(v[i]==0)
for(j=2;j<=1000000/i;j++)
v[i*j]=1;
//ciur Eratostene
f>>n>>p>>e;
--n;
for(int i=p+1;;i++)
{
if(v[i]==0)
{
p=p+i;
n--;
}
if(n==0)
break;
}
if(e==1)
g<<p;
if(e==2)
{
if(p<=9)
g<<p;
else
{
s=9;
if(p<=99)
{
s+=(p-9)*2;
}
else
{
s+=180;
if(p<=999)
{
s+=(p-99)*3;
}
else
{
s+=2700;
if(p<=9999)
{
s+=(p-999)*4;
}
else
{
s+=36000;
if(p<=99999)
{
s+=(p-9999)*5;
}
else
{
s+=450000;
if(p<=999999)
{
s+=(p-99999)*6;
}
else
{
s+=5400000;
if(p<=9999999)
{
s+=(p-999999)*7;
}
}
}
}
}
}
}
g<<s;
}
return 0;
}
Explicație: