Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <fstream>
- #define Xmin 0LL
- #define Xmax 1000000000000000000LL
- #define LL long long
- using namespace std;
- /// Clasa pentru citiri de date din fisiere
- /// =======================================
- class InParser
- {
- private:
- FILE *fin;
- char *buff;
- int sp;
- char read_ch()
- {
- ++sp;
- if (sp == 4096)
- {
- sp = 0;
- fread(buff, 1, 4096, fin);
- }
- return buff[sp];
- }
- public:
- InParser(const char* nume)
- {
- fin = fopen(nume, "r");
- buff = new char[4096]();
- sp = 4095;
- }
- InParser& operator >> (int &n)
- {
- char c;
- while (!isdigit(c = read_ch()) && c != '-');
- int sgn = 1;
- if (c == '-')
- {
- n = 0;
- sgn = -1;
- }
- else
- {
- n = c - '0';
- }
- while (isdigit(c = read_ch()))
- {
- n = 10 * n + c - '0';
- }
- n *= sgn;
- return *this;
- }
- InParser& operator >> (long long &n)
- {
- char c;
- n = 0;
- while (!isdigit(c = read_ch()) && c != '-');
- long long sgn = 1;
- if (c == '-')
- {
- n = 0;
- sgn = -1;
- }
- else
- {
- n = c - '0';
- }
- while (isdigit(c = read_ch()))
- {
- n = 10 * n + c - '0';
- }
- n *= sgn;
- return *this;
- }
- };
- /// Clasa pentru scrieri de date in fisiere
- /// =======================================
- class OutParser
- {
- private:
- FILE *fout;
- char *buff;
- int sp;
- void write_ch(char ch)
- {
- if (sp == 50000)
- {
- fwrite(buff, 1, 50000, fout);
- sp = 0;
- buff[sp++] = ch;
- }
- else
- {
- buff[sp++] = ch;
- }
- }
- public:
- OutParser(const char* name)
- {
- fout = fopen(name, "w");
- buff = new char[50000]();
- sp = 0;
- }
- ~OutParser()
- {
- fwrite(buff, 1, sp, fout);
- fclose(fout);
- }
- OutParser& operator << (int vu32)
- {
- if (vu32 <= 9)
- {
- write_ch(vu32 + '0');
- }
- else
- {
- (*this) << (vu32 / 10);
- write_ch(vu32 % 10 + '0');
- }
- return *this;
- }
- OutParser& operator << (long long vu64)
- {
- if (vu64 <= 9)
- {
- write_ch(vu64 + '0');
- }
- else
- {
- (*this) << (vu64 / 10);
- write_ch(vu64 % 10 + '0');
- }
- return *this;
- }
- OutParser& operator << (char ch)
- {
- write_ch(ch);
- return *this;
- }
- OutParser& operator << (const char *ch)
- {
- while (*ch)
- {
- write_ch(*ch);
- ++ch;
- }
- return *this;
- }
- };
- InParser f("2017.in");
- OutParser g("2017.out");
- int Q,c;
- LL K;
- LL F(LL x,int c)
- {
- LL p,n,z;
- n=0; /// nr de aparitii a cifrei c
- p=1; /// pornim de la ultima cifra(p=10-penultima cifra,p=100-antepenultima...)
- z=0; /// in z memoram ultimele cifre ale numarului k, care au fost extrase
- while(x>=c)
- {
- if(x%10>c)
- n+=(x/10+1)*p;
- else
- if(x%10==c)
- n+=x/10*p+z+1;
- else
- n+=x/10*p;
- z+=x%10*p;
- x/=10;
- p*=10;
- }
- return n;
- }
- LL query(int c,LL K)
- {
- LL le=K/10+1,ri=K*10,mid,best;
- while(le<=ri)
- {
- mid=(le+ri)/2;
- if(F(mid,c)>=K)
- {
- best=mid;
- ri=mid-1;
- }
- else le=mid+1;
- }
- return best;
- }
- int main()
- {
- for(f>>Q;Q;--Q)
- {
- f>>c>>K;
- g<<query(c,K)<<'\n';
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement