Local boy Pujara struck his ninth test hundred before he was out for 124 while Vijay fell in the penultimate over of the day for 126 after his seventh century.
India captain Virat Kohli was unbeaten on 26 after nightwatchman Amit Mishra fell without scoring in the last over bowled by left-arm spinner Zafar Ansari.
It was a tough day for England's attack. They toiled through a wicketless second session but picked up three after tea.
The touring side, who posted a huge 537 in the first innings of the five-match series, made an early breakthrough after India had resumed on 63-0 when paceman Stuart Broad trapped Gautam Gambhir leg before with his first delivery of the morning.
The left-hander missed a straight delivery from Broad, who is playing in his 100th Test, and was out for 29.
Pujara joined Vijay at the crease and soon found his rhythm with some crisply driven boundaries.
The 28-year-old Pujara, considered a specialist test batsman, thrived against England's spin bowlers but needed all of his defensive guile to negotiate a hostile spell from Chris Woakes when the fast bowler hit him three times on the helmet.
Pujara scampered for a single off Woakes to get to three figures and the sparse crowd applauded.
He was finally dismissed when he guided Ben Stokes to England captain Alastair Cook at slip.
Vijay, who hit nine fours and four sixes, reached his century with two boundaries off Broad and put on 41 with Kohli for the third wicket.
Broad should have had Vijay's wicket when the batsman was dropped on 66 by 19-year-old debutant Haseeb Hameed as he dived to his left in the covers.
Pujara was given out leg before off Ansari on 86 but overturned the umpire's verdict through the Decision Review System (DRS) that is making its debut in a bilateral series in India. Reviews showed the ball was going over the stumps.
Leg-spinner Adil Rashid got Vijay's wicket when he was caught at short leg by Hameed.
Original source: Vijay, Pujara lead India’s fightback against England