noi

Filipino students brought home the country’s second bronze medal from one of the most prestigious computer science competitions in the world, proving for the second time that our local homegrown students can compete alongside all the other nations.

Robin Yu, competing as a Grade 11 student from Xavier School, won bronze at the recently concluded International Olympiad in Informatics (IOI) held in Kazan, Russia. He managed to get a perfect score of 100 for Detecting Molecules (Day 1) and Paint By Number (Day 2). Including the partial scores for both days, he was able to obtain an impressive 257 points for the whole competition. This feat earns him his second bronze medal for the IOI.

Farrell Wu, on the other hand, competed as a Grade 11 student from MGC New Life Christian Academy. He managed to score 190 points for the whole competition.

The younger participants among the four were Maded Batara III, a Grade 10 student from the Philippine Science High School – Main Campus and also a first-timer, and Ian Palabasan, competing as a Grade 9 student from Rizal National Science High School. Both accumulated a total of 72 points each across all the problems given during the competition.

The four students were accompanied by team leader Kevin Atienza and deputy team leader Payton Yao, both prominent local figures in the national competitive programming scene. The students were coached by Kevin Atienza, Payton Yao, and Jared Asuncion.

This is only the second time that a Philippine delegation was sent to represent the country in the International Olympiad in Informatics – and the second time our delegates have reaped awards for our country. This year, a total of 324 participants from 88 countries registered to the Olympiad. Among the countries represented are China, Russia, Japan, Canada, Taiwan, Singapore, Korea, Vietnam, the US, Australia and the Philippines.

The students were sponsored by local tech companies 24/7 International, Bitstop Networking Services, Custom Thread, D&L Industries, Inc., Pointwest Technologies Corporation, Smart Communications and Thinking Machines Data Science. The organizing team would also like to thank Tonette Rivera for her help.

The Philippine delegation to the IOI were chosen among the top students who joined the third annual National Olympiad in Informatics – Philippines (NOI.PH 2016). The organizing committee for the NOI.PH is composed mainly of UP graduates. who were once participants and winners of university-level programming contests. They volunteer each year to organize the NOI and IOI so that students can experience the joys of competitive programming at an earlier age. NOI.PH was started by Martin Gomez and Wilson Chua back in 2014, with similar goals.

Robin Yu brought home the first IOI medal last year and has been training in programming for the past few years. He spends most of his time training mostly through self-study. However, he never hesitates to ask for the help of the NOI.PH Scientific Committee on the rare occassion that he gets stuck. Apart from NOI.PH, he has placed in a lot of online competitions he joined at his own volition. He also joined Google Code Jam, where he placed third, just under Kevin and Payton, in one round among all the Filipino competitors. People say he is a creative thinker, probably because his height offers him a different perspective of the world.

Farrell Wu is named as one of the Ten Smartest Kids in the World by The Business Insider in 2013. He has garnered awards in a number of global competitions, including the prestigious International Math Olympiad (IOI) and the Australian Mathematics Competition where he aced all the questions. He was granted Filipino citizenship status thru House Bill 4073 early last year after he expressed desire to be a full-fledged Filipino. He brought a stuffed penguin during the IOI because he likes penguins. And perhaps stuffed toys too.

Maded Batara, coached by Edge Angeles, hails from Iligan City and has been training with us for the last two years. Starting Grade 1, he has placed in the MTAP division finals for six consecutive years. Aside from the NOI, he has also participated in and won other several technology related competitions such as the Ateneo Programming Open and the Grace IT Quiz Bee. Even though he is quite young, he is very organized and was responsible for coordinating a couple of team selfies during the IOI (as per the request of the organizing committee).

Ian Palabasan is a self-proclaimed addict in C++, a programming language. He has participated in several programming competitions held in Ateneo and FEU coincidentally with some his other competitors from the NOI. He is a fan of Undertale, a role-playing game about refusing to give up. This is why during the IOI, he was filled with determination.

Now that you know all about the Philippines’ representatives to the IOI 2016, let’s see what they have to say about their IOI experience.

The NOI.PH 2016 National Finals was held in De La Salle Lipa. It consisted of two rounds on-site, each of which consisted of four problems.

NOI.PH Finals Round 1

Almost all our participants finished the first subtask of 1A: A Simple Problem!, each giving them eight points. Ian Vincent Palabasan (Rizal National Science High School), Franz Louis Cesista (Philippine Science High School – Eastern Visayas Campus), and Joaquin Jose Lopez (Philippine Science High School – Main Campus) scored the first two subtasks. Proving that is indeed a simple problem was Robin Yu (Xavier School) finishing all subtasks and getting 100 points for it. Participants seem to really really really really really really like 1B: Confidential Message since most of them scored at least 32 points for answering the first two subtasks. Robin went above and beyond and finished the next two subtasks too, netting him a total of 72 points. Three participants scored a perfect 100 for 1D: Pabebe Girl Cuts Cake. Truly, hindi sila napigilan until the system told them tama na ‘yan after submitting their code. Finally, only one participant attempted 1C: The King and Queen of Rock and Roll. Robin Yu was the only one to submit code for this problem, and it was code that succesfully treated all subtasks. This nets him another 100 points.

NOI.PH Finals Round 2

Robin and Farrell did not make us paasa since they both got a perfect score in 2A: Paasa Numbers. In addition, Robin, Franz and Farrell kept cruising and can’t stop won’t stop coding until they also managed to get a perfect score in 2B: Shake It Off. The participants, though, had a little trouble with 2C: Candles For Everyone as no one managed to pass any subtask beyond the second. Finally, Robin impresses us again one final time this year, as he was the only contestant to score in 2D: Goodbye, Awkward Goodbyes!, managing to finish all but the last subtask.

Final Message

Congratulations to all the winners of the National Olympiad in Informatics – Philippines 2016 Finals!

We thank our hosts De La Salle Lipa, the Province of Batangas, and Batangas Vice-Governor Mark Leviste; our partners Bitstop Network Services Inc. and HackerRank; our friends at the Science Education Institute – Department of Science and Technology and the Office of President Noynoy Aquino (P-Noy); and most especially the sponsoring government agency of this event, the Information and Communications Technology Office (DOST-ICTO).

Do you want to have a chance to compete in the International Olympiad in Informatics? Register for the next NOI.PH now!

The NOI.PH 2016 National Eliminations was divided into three sets of four problems each.

NOI.PH Online Round 1

Farrell Wu (MGC New Life Christian Academy) managed to put together 68 points in 1A: Putogethers and 78 points in 1C: The Holiday School Play. This makes him the top scorer for these two problems. Meanwhile, Robin Yu (Xavier School), managed to run up the scoreboard by geting a perfect score in 1B: 런데빌런. Six people attempted 1D: Dishes, How We Do It? Unfortunately, none of the contestants were able to show us how to do it.

NOI.PH Online Round 2

The Christmas spirit clearly was with Chryz Than Wolf Chavez (Philippine Science High School – Bicol Region Campus), scoring 60 on 2A: Christmas at NAIA. Meanwhile, Ian Vincent Palabasan (Rizal National Science High School) and Andrea Jaba (Saint Jude Catholic School) scored 32 on 2B: HeKaSerye. It is believed they scored sa tamang panahon. Ian managed to get a perfect score in 2C: Meteor Garden Garden. You really can’t help falling in love with that kind of score! Robin Yu tied with everyone above for the highest score in the first three problems. However, among the eight who attempted 2D: Balikbayan Boxes, he was the only one to bring home any score. Not just any score, he scored a perfect hundred! We hope scores don’t get taxed too!

NOI.PH Online Round 3

Almost everybody was 3A: Kung-Fu Fighting since a lot of the contestants attempted it. Farrell, Ian, Ron Mikhael Surara (Philippine Science High School – Bicol Region Campus) and Joaquin Jose Lopez (Philippine Science High School – Main Campus) would have made Master Shifu proud for scoring 22 points in that problem. Moreover, Farrell swooped in and scored 24 points in 3B: Fast As Lightning. Living up to its name, 3C: A Little Bit Frightening managed to scare away most of the participants, save for nine brave souls who attempted it. Farrell, Andrea, Shaquille Wyan Que (Grace Christian College) and two eighth-graders Rae Gabriel Samonte (Philippine Science High School – Bicol Region Campus) and Jed Arcilla (Philippine Science High School – Bicol Region Campus), manged to score 56 points on 3D: Expert Timing.

In this post, we answer some questions that participants have asked us.

Q: Is there any way to bypass the 264-1 limit in Java or C++?

A: Java has an arbitrary-precision library called java.math.BigInteger (and java.math.BigDecimal). Keep in mind though that problems used in official NOI contests usually won’t require the use of arbitrary-precision libraries. But we’re not preventing you from using them!

For C++, there is no built-in arbitrary-precision library, so it depends on the amount of “bypassing” you want. For example, you can simulate 128-bit integers by creating a class with two 64-bit integers, the first one representing the higher-order bits and the second the lower-order bits. If you want to use larger numbers, I suggest implementing your own arbitrary-precision arithmetic library.

Q: What is the big O notation and why do I see it in editorials all the time?

A: Roughly speaking, the big O notation expresses the speed of your program relative to the input size. In other words, it describes how quickly your program’s running increases as the input size increases. O(f(n)) roughly means that if the input size is n, then the running time grows approximately as f(n).

For another explanation, we recommend reading this. Also, don’t hesitate to ask us if you’re still having trouble understanding it!

Q: What do you suggest for inputs where n is near the billions?

A: For such problems, an O(n) solution would most likely not be accepted, due to the time limits. (Even a loop from 1 to n might not finish in time!) Try finding faster (sublinear) solutions, such as those that run in O(√n), O(log3 n), O(log n) or O(1) time (to name a few). Also, for n ≤ 1018, some slower solutions, such as those that run in O(√n) time, become too slow for these time limits.

However, time complexities such as O(n) can be a bit misleading, because there is a hidden constant behind the O() notation. Also, using pure operation count as your basis for program speed isn’t necessarily more accurate either, because some operations are slower than others. For example, one division is much slower than one bit shift. It’s up to you to judge, and it takes some experience to get the hang of it.

Q: What is “modulo”, and why do a lot of problems ask for the answer “modulo” some number?

A: The result of the operation“a mod b” (read “amodulob”) is simply the remainder when a is divided by b (here b is called the modulus). For example, 100 mod 3 = 1, 5 mod 100 = 5, 100 mod 5 = 0, and 0 mod 11 = 0.

Usually, a problem asks for the answer modulo some number so that the output size isn’t very large, and that computation can all be done without resorting to arbitrary-precision arithmetic. This is because of the following properties of the modulo operation (among others):

This means that intermediate values can be reduced modulo m safely as long as the operations involved are addition, subtraction, and multiplication (and possibly some other operations).

In C, C++, Java and Python, a mod b is written as a % b.

Q: Why do a lot of problems use the modulus 109+7 if we could just use something else, for example 109?

A: 109+7 is prime, and a prime modulus is desirable in some cases:

1. Sometimes, if the modulus is 109, some important values become 0 for large inputs (or something trivial), making the problem a bit easier for those inputs. But usually when the modulus is prime, it doesn’t. For example, n! mod 109 quickly becomes 0 as early as n = 40, but n! mod (109+7) is nonzero until n = 109+6.

2. You can “divide” modulo a prime by using modular inverses. Keep in mind though that modular inverses usually aren’t required in official NOI contests.

In some problems, the modulus plays a key role, and a problem can be very difficult with one modulus and easier with another. For example, if we ask you, given n ≤ 106, to compute n! mod m for some modulus m, then the problem is easy if m = 109 but a bit harder if m = 109+7. So we recommend paying attention to the modulus.

Q: How do I prepare for the NOI if I have limited knowledge on problem solving, algorithms and implementation?

A: The best way to improve is to join online contests regularly. For example, HackerRank, Codeforces, CodeChef, etc. host programming contests regularly (for example, in weekly / monthly intervals). Check this link for a schedule of upcoming contests. Joining these contests is free!

If you have limited time, I suggest going through all past NOI problems (which are all hosted in our HackerRank NOI practice page) and solving as much as you can, preferably those you feel are standard stuff but you’re not familiar with. Remember that, being past NOI problems, these problems usually have their editorials available somewhere.

For standard stuff like graphs, data structures, standard algorithms, etc., we suggest you to learn them as soon as possible. You can’t rely on pure instinct all the time.

Finally, I suggest learning problem-solving and implementation skills simultaneously. As you encounter new algorithms/data structures, implement them immediately. Usually when you find tutorials, there are sample problems you can try them out with.

Q: What resources would you recommend for learning?

A: Aside from all the links given in the editorials of past NOI problems (of which there are a lot!), you may check this link for a list of tutorials and sample problems. You can find a lot of things to learn there. Be warned though that they aren’t listed in increasing order of difficulty, so I don’t suggest learning them in that order!

In general, you can try searching the web for any topic you hear about, and you might find a tutorial for that. Sometimes, especially in CodeChef long contests, we even look at research papers for solution (and problem) ideas!

But be sure you’re usually able to code brute-force solutions first! Don’t underestimate experience. You could be the most talented guy and yet fail at contests if you can’t code well enough.

Also, try setting a goal for yourself. For example, solve all NOI practice problems, or get some number of points in UVa Online Judge, or get to a certain rating in Codeforces/HackerRank/CodeChef, etc. During college I tried to get as many points in UVa as possible, and it helped me solve and train regularly.

Holding eliminations rounds online is the most feasible setup we can do this year for a national programming competition for high school students. This setup is convenient for you, the participants, as you can code at the comfort of your own school – or even at your own home!

To keep everything as fair as possible, we trust that all participants and coaches read through and follow the honor code below during the online elimination rounds:

The Four Codemandments

I.The first rule of reading NOI problems
is you do not talk about the NOI problems
(until after the round is concluded)

You are not allowed to discuss the problems with anyone else until after an hour after the contest. This includes talking to your co-participants in-person or online. Moreover, posting the problems on forums (such as but not limited to Quora, etc) during the contest is not allowed. Co-participants, coaches, parents, siblings, guardian angels, and friends may stay with you for moral and technical support (i.e. setting up the computer), but offering and receiving help in solving the problems is strictly prohibited.

II.Any code submitted to the contest
must have been written by you

All parts of the code you submitted must have been written by you, the participant. Snippets of codes you have written in the past may be used during the contest itself. Codes from other people including but not limited to friends, co-participants, and strangers from the Internet are not allowed. Suspicious code, as has been done in the past, will be investigated.

III.Questions regarding the problems are to be raised
at the discussion panel of the problem

Questions specific to the problems involved should be written in the discussion panel of the problem for everyone to see. This means that all correspondence between the NOI Scientific Committee regarding the problems are public and available to all. You could also check your notifications and the discussion pages of the problems should the need arise for clarifications. For technical support, you may consult ask[at]noi.ph preferably before the contest starts.

IV.Consulting the internet is fine.

As this is an online competition, it is nearly impossible to ban participants from consulting the Internet for help with the problems. Moreover, it might even lose you time if you only start reading on the duration of the contest itself. So we suggest you prepare before the contest starts. Furthermore, we would like to reiterate that from the second codemandment, you are not allowed to copy-paste any code found on the internet. We advise not to use it too much though, as in the Finals Round, using the Internet for purposes other than HackerRank is prohibited.

Penalties

NOI.PH is an official event of the Philippines sanctioned by the government of the Republic. The consequences of violating any of the aforementioned commandments are at least the following:

Immediate disqualification from the whole competition.

Cases of dishonesty will be reported to government agencies including, but not limited to, the DOST, ICTO, and DepEd.

Attempt #1

Before we begin, read the problem first and try to think of a solution. Are you done? Let’s begin. Here is our first attempt at this problem.

Attempt #1

Java

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

importjava.io.*;

importjava.util.*;

importjava.text.*;

importjava.math.*;

importjava.util.regex.*;

publicclassSolution{

publicstaticvoidmain(String[]args){

Scanner sc=newScanner(System.in);

intT=sc.nextInt();

for(intkeis=1;keis&lt;=T;keis++){

intN=sc.nextInt();

intP=sc.nextInt();

int[]arr=newint[N];

arr[0]=P;

for(inti=1;i&lt;arr.length;i++){

arr[i]=arr[i-1];

}

intANS=0;

for(inti=0;i&lt;arr.length;i++){

ANS+=arr[i];

}

System.out.println(ANS);

}

}

}

Looking at the code, do you think this will print the correct answer? Let’s submit it and see what happens.

Oh no! We got a wrong answer, even for the sample test file! We were very careless.

We can actually press the Run Code button first to see how our code fares with the sample input. Pressing the Run Code button gives us this:

Sample input. Running our code with the sample input, we can clearly see where we went wrong in that specific case.

Attempt #2

Just like Jason Mraz, we wont give up! We can see from the disaster that is Attempt #1 that we forgot to take note of the output format. Now, rewriting line 22 as:

Attempt #2

Java

22

System.out.println("Php "+ANS);

We submit again and obtain…

Attempt #2. We have the first test file down, but the second subtask is stubborn! Let’s investigate.

The reason why this is a wrong answer is not trivial. Where are we going wrong? Let’s look at the judges’ input to see what’s happening.

Judges' Input

Java

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

100

2149599350507998472

486675710255186788

26073129451197348814

1204142729620751190

9411913732569041728

12873255162052893020

1523141987385124468

7502341692834659788

24162145331475354239

17758902292413632196

12215352072107202348

2379963155560375889

20197029562490563604

12753675411797762070

25653221142265556196

5135094692027310655

29451782981189598371

21883000982468591817

1574804947575296376

17372110271011514760

37461169853752274

521939010484403605

17300038792234029273

1112478100975189695

1918724042700193810

22660666671049565530

29154865511264144540

239273375417637084

24363822542367886554

481420834271378083

254644297558367108

1740178541431859644

880920901265895630

1907899781380011834

11886194951642679744

19251340572283687165

19730156221748658555

14847614271127434130

2544863731784916287

6780196251283269495

21915525521712515110

174810651396714781

5984156192447735437

5805592921435454777

2785331264314480211

29485773452747306490

16226105981779351758

27639033471324331529

21879650451205758060

19890919751458145420

21283823102184064204

1993310331381183136

9252555662946653207

20085687162264247

2520777175858816087

2788214701456044704

1677078229946502052

5379534682238907172

1990292881982665064

736802005165845852

5965252701663405367

3466960752573763267

8781297941550851618

19294550831613795088

2510577406442449030

16661894901242855994

2255045752312312304

23559195552969441839

6403339862370871371

28335771112543696564

28927884092777883149

17440490751285453588

790329449388405548

942439644307105487

27791975521255888011

21970645132704236251

1484820861934698559

1319156727122341872

2137652007585416622

7031104992880437369

24786537091480060599

21085754432468976134

2130355818552100462

26160142261946733248

606706162815119891

10730287121045812347

1602281921789223452

28198627861580303966

436264953375265798

22751298352315143528

7285008262142560571

14925531281062715927

16951442261134043474

837699491704817060

7970949381203983562

14252408881341645201

3765751882840710928

23882975801446517922

805432949155624349

17874744772178863903

Attention! Normally, it wouldn’t be possible to look at the judges’ input. You’ll have to try your own test cases based on the constraints to see why you’re getting a wrong answer. You normally need to be creative enough to figure out which large cases your program fails at.

Custom input. Let’s try to run our program to the judges’ first test case.

You get an error. Can you try fixing the code before reading the next section?

Attempt #3

If you were keen enough, you would have figured out that to fix the error, we should have taken long as input, as opposed to int. This could have been avoided if we carefully looked at the constraints. A Java int would have a maximum value of 2147483647 before overflowing. This is less than 2149599350, the first value of N in the judges’ input. Sneaky judges! Let’s fix our code once again!

We need to get rid of an array since allocating space for more than 2147483647 ints will be too much! We should realize that all array elements assign the same value P. Let’s throw away the array and just add P again and again until we’ve done it N times. This should be correct now.

Attempt #3

Java

8

9

10

11

12

13

14

15

16

17

18

19

longT=sc.nextLong();

for(intkeis=1;keis&lt;=T;keis++){

intN=sc.nextInt();

longP=sc.nextLong();

longANS=0;

for(inti=0;i&lt;N;i++){

ANS+=P;

}

System.out.println("Php "+ANS);

}

}

}

…and submit!

Terminated due to timeout. Our program runs too slowly!

We have exceeded the time limit of 4 seconds (for Java)! That means our algorithm runs very slowly. Perhaps there is something we’re doing inefficiently? Maybe we’re making our program compute unnecessary operations? What could it be?

Final Attempt

Now, after using pen and paper to figure out how to rewrite my program to make it more efficient, here’s my program to solve the problem correctly and quickly. Here’s the code!

Working Code

Java

1

2

3

4

5

6

7

8

9

10

11

12

13

14

????????????????

??????????????????

??????????????????

??????????????????

????????????????????????

????????????????????

???????????????????????????????????

????????????????????????????????

????????????????????

??????????????????????????????

??????????????????????????????????????????????????????

?

?

?

If it doesn’t show up properly in your browser, don’t worry! You’re smart enough to figure it out for yourself!