#2579 Putere2Interval

Cerința

Se citesc 3 numere naturale n, a și b. Afișați primele n puteri ale lui 2, în ordine crescătoare, din intervalul [a,b]. Dacă nu există cel puțin n puteri ale lui 2 în interval, atunci se vor afișa cele care există.

Date de intrare
Programul citește de la tastatură numărul n, a și b, separate prin spații.

Date de ieșire
Programul va afișa pe ecran puterile lui 2 din intervalul [a,b].

Restricții și precizări
1 ≤ n ≤ 60
1 ≤ a ≤ b < 2^64



Exemplu
Intrare

2 6 35
Ieșire

8 16
Explicație

În interval există 3 puteri ale lui 2, dar s-au afișat doar n dintre ele.
Sursa mea:

#include
using namespace std;
long long n,a,b;
int main()
{
cin>>n>>a>>b;
for(int i=a;i<=b && n!=0;i++)
if(!(i&(i-1)))
{
cout< n--;
}
}
Este de 60%


Răspuns :

#include <iostream>

#include <cmath>

using namespace std;

int main()

{

   unsigned long long n, a, b, k,p=1,i;

   cin >> n >> a >> b;

   k=log2(a);

   if (log2(a)!=(int)log2(a)) ++k;

   for (i=1; i<=k; ++i) p*=2;

   while (p<=b && n)

   {

       cout << p << " ";

       --n; p*=2;

   }

   return 0;

}