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
.
Cum e corect?
cout < "As la info";
cout << "As la info";
cout >> "As la info";
Felicitări! Poți mai mult?
Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.
Greșit, dar nu-i bai!
Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.
Rezolvare
Iată rezolvarea de 100 de puncte pentru problema NREcou:
#include<bits/stdc++.h>
#define MOD 1000000017
using namespace std;
ifstream in("nrecou.in");
ofstream out("nrecou.out");
long long v[10002],sol[10002];
long long pow_log(long long x)
{
long long p=10,boss=1;
while(x!=0)
{
if(x%2==1)
{
boss*=p;
boss%=MOD;
}
p*=p;
p%=MOD;
x/=2;
}
return boss;
}
long long calc(long long x)
{
long long y;
y=pow_log(x-1);
y*=9;
y%=MOD;
return y;
}
int main()
{
long long n,i,k=0,j,s=0;
in>>n;
for(i=1;i*i<n;i++)
if(n%i==0)
{
v[++k]=i;
v[++k]=n/i;
}
if(sqrtl(n)==(long long)sqrtl(n))
v[++k]=sqrtl(n);
sort(v+1,v+k+1);
k--;
for(i=1; i<=k; i++)
{
sol[i]=calc(v[i]);
for(j=i-1;j>=1;j--)
if(v[i]%v[j]==0)
{
sol[i]-=sol[j];
while(sol[i]<0)
sol[i]+=MOD;
}
}
for(i=1;i<=k;i++)
{
s+=sol[i];
s%=MOD;
}
out<<s;
return 0;
}
Atenție
Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa .
Rezolvarea problemei #2930 NREcou
Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #2930 NREcou de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.
Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!