Вот текст задачи:
Представим себе бесконечную последовательность цифр, составленную из записанных друг за другом возрастающих степеней десятки. Вот начало этой последовательности: 110100100010000… Всё, что надо — определить, какая цифра находится в такой последовательности на определённом месте.
Исходные данные
В первой строке находится целое число N (1 ≤ N ≤ 65535).В i-й из N последующих строк записано целое число Ki—номер позиции в последовательности (1 ≤ Ki ≤
-1).
Результат
Выведите через пробел N цифр. i-я цифра должна равняться цифре, которая находится в описанной выше последовательности на позиции с номером Ki.
Ограничения: по времени 1с; по памяти 16 mb.
Вот мое решение:
#include<iostream>
#include<cstdlib>
using namespace std;
int cmp(const void*a, const void*b){
return (*(long*)a-*(long*)b);
}
int main(void){
long N,A,i,k,l,m=0;
long *b;
char *a;
k=0;l=0;
cin>>N;
b=new long[N];
a=new char[N];
for(i=0;i<N;i++){
cin>>b[i];
}
qsort(b,N,sizeof(long),cmp);
for(i=0;i<2147483648-1;i++){
if(k==l) {k++;l=0;if(b[m]==i+1){a[m]=1;m++;if(m==N) break;}}
else if(b[m]==i+1){a[m]=0;m++;if(m==N) break;}
l++;
}
for(i=0;i<N;i++){
if(i!=N-1){cout<<(int)a[i]<<" ";}
else {cout<<(int)a[i];}
}
cout<<endl;
system("pause");
return 0;
}
То есть я строю последоватьность до наибольшего номера позиции которую нужно вывести.
Можно ли как то улучшить такой алгоритм? А то Time limit exceeded, при больших Ki.
Если нельзя, то как дойти до такого :
Код:
a:=(sqrt(8*b-7)-1)/2;
if (frac(a)<eps) or (frac(a)>1-eps) then write('1 ')
else write('0 ');