Cifre7

Se generează un şir de cifre ai cărui primi termeni sunt, în această ordine:
1, 1, 2, 4, 7, 3, 4, 4, 1, 9, 4, 4, 7, 5, 6, 8,…

Cerința
Deduceţi regula după care sunt generaţi termenii şirului şi scrieţi un program care să citească numerele naturale n, k şi p şi care să determine:

a) numărul de apariţii ale cifrei k printre primii n termeni ai şirului din enunţ;
b) cel de-al p-lea termen al şirului din enunţ.

Date de intrare
Programul citește de la tastatură numerele n k p.

Date de ieșire
Programul va afișa pe ecran două numere naturale:

primul număr va reprezenta numărul de apariţii ale cifrei k printre primii n termeni ai şirului din enunţ;
al doilea număr va reprezenta cel de-al p-lea termen al şirului din enunţ.
Restricții și precizări
Numerele n k p sunt naturale
17 ≤ n ≤100; 0 ≤ k ≤ 9; 1≤ p ≤ 2000000000
Pentru rezolvarea corectă a cerinţei a) se acordă 30% din punctaj iar pentru cerinţa b) 70% din punctaj.

Exemplu
Intrare

19 4 26
Ieșire

5
7
Explicație
Primii 19 termeni ai şirului sunt: 1,1,2,4,7,3,4,4,1,9,4,4,7,5,6, 8,9,3,0.

Primul număr afişat este 5, deoarece sunt 5 cifre din șir egale cu k (k=4) printre primii n=19 termeni ai şirului.

Al doilea număr afişat este 7, deoarece cel de-al p-lea (p=26) termen al şirului este 7.

SOLUTIE

include

using namespace std;

int main()
{
int n, k, p, a=1, b=1, c=2, x, cnt=0;
cin >> n >> k >> p;
if(a==k) cnt++;
if(b==k) cnt++;
if(c==k) cnt++;
for(int i=4; i<=n; i++)
{
x = (a+b+c)%10;
a=b;
b=c;
c=x;
if(c==k) cnt++;
}
cout << cnt << endl;
a=1;
b=1;
c=2;
p=p%124;
if(p==0)p=125;
if(p==1) cout << a;
else if(p==2) cout << b;
else if(p==3) cout << c;
else
{
for(int i=4; i<=p; i++)
{
x = (a+b+c)%10;
a=b;
b=c;
c=x;
if(c==k) cnt++;
}
}
cout << c;

return 0;

}