Există o serie de probleme pentru care rezolvarea lor se rezumă la aflarea exponentului unui număr dat
O metodă naivă ar fi căutarea multiplior lui k mai mici sau egali cu n și de câte ori de divid acestia cu k.
Exemplu:
O soluție ar fi parcurgerea intervalului
C++
______________________________
exp=0
for (int i=k;i<=n;i+=k)
{
int x=i;
while(x%k==0)
{exp++;x/=k;}
}
cout<<exp;
___________________________
Termenul dominant este T(n) ->n/k (algoritm linear).
O altă soluție ar fi folosirea unei formule de calcul a exponentului lui
Dacă numărul k este prim
Exemplu:
Se poate deduce că după un anumit număr de pași raportul va deveni subunitar ceea ce determină că suma va avea un număr finit de termeni. Pornind de la această relație, valoarea acelui exponent se poate calcula însumând câturile împărțirilor succesive.
Implementarea C++.
________________________________________
exp=0
while(n>=k)
{
n=n/k;
exp+=n;
}
________________________________________
Termenul dominant este T(n) ->log(n) (algoritm logaritmic)
Dacă numărul
Exemplu:
În concluzie,
Implementare C++
________________________________________
int a,b,divi[100],puterea[100],poz,minim;
int putere(int n,int p)
{
int x=0;
while(n>p)
{
x+=n/p;
n=n/p;
}
return x;
}
int main()
{
f>>b>>a;
int d=2;
while(d*d<=a)
{
if(a%d==0)
{
divi[++poz]=d;
int c=0;
while(a%d==0)
{
a/=d
puterea[poz]++; }}
d++;
}
if(a!=1)
{
divi[++poz]=a;
puterea[poz]=1;
}
minim=1000000;
for(int i=1;i<=poz;i++)
{
puterea[i]=putere(b,divi[i])/puterea[i];
if(minim>puterea[i])
minim=puterea[i];
}
g << minim;
return 0;
}
________________________________________
Probleme ataşate
Nr. | Problema | Clasa | Dificultate | Operații I/O |
---|---|---|---|---|
1 | #1826 - ZeroF | 10 | ușoară | consola |
2 | #0440 - FactZero1 | 9 | medie | consola |
3 | #0439 - FactZero | 9 | ușoară | consola |
4 | #1780 - Fractie | 9 | medie | consola |