fbpx

Problema #2930 – NREcou – Rezolvari PBInfo

de Mihai-Alexandru

Cerința

Dorind să inventeze ceva nou Mate a inventat numerele “ecou”. Un număr natural A se numește număr-ecou dacă există un număr natural B cu proprietatea că numărul A se poate obține prin concatenarea de un număr de ori (cel puțin de două ori) a numărului B. De exemplu numărul 313313 este număr-ecou, iar 31313 nu este număr-ecou.

Mate și-a propus să afle câte numere-ecou sunt printre numerele naturale care au exact N cifre. Deoarece acest număr poate fi foarte mare, se va afișa doar restul împărțirii rezultatului la 10^9+17.

Date de intrare

Fișierul de intrare nrecou.in conține pe prima linie numărul n, iar pe a doua linie n numere naturale separate prin spații.

Date de ieșire

În fișierul de ieșire nrecou.out se va afișa, pe primul rând, valoarea cerută.

Restricții și precizări

  • pentru 20% din teste 1 ≤ N ≤ 6
  • pentru alte 20% din teste N ≤ 12
  • pentru alte 30% din teste N ≤ 10.000
  • pentru alte 30% din teste N ≤ 1.000.000

Exemplu

nrecou.in

3

nrecou.out

9

Explicație

Numerele ecou cu trei cifre sunt 111, 222, 333, 444, 555, 666, 777, 888, 999.

#include <bits/stdc++.h>
using namespace std;

ifstream cin("nrecou.in");
ofstream cout("nrecou.out");

int n , D[10000000] ; 
long long nr , rez;

int main()
{
    cin >> n;
    for(int d = 2 ; d <= n && n / d >= 2 ; d++)
        if(n % d == 0)
        {
            nr = 9;
            int x = d;
            for(int j = 1 ; j < x ; j++)
                nr = (nr * 10) % 1000000017;
            for(int p = 2 ; p <= x / 2 ; p++)
            {
                if(x % p == 0) nr -= D[p];
                if(nr < 0) nr += 1000000017;
            }
            nr -= 9;
            if(nr < 0) nr += 1000000017;
            D[d] = nr % 1000000017;
            rez = (nr + rez) % 1000000017;
        }
    cout<<(rez+9)%1000000017;
    return 0;
}
Comentarii

S-ar putea sa iti placa