wattanapong suttapak SE, ICT University of Phayao
1. string.split(“pattern”); 2. sorting function return index; 3. function prime number 4. function factorial 5. Insertion Sort 6. Radix Sort 7. depth first search 8. breath first searh
โจทย์ (1 วินาที ) ให้คำนวณหาค่า B P mod M ( ให้คำนวณให้ทันเวลาที่กำหนด นั่นคือ 3 วินาที ) อินพุท แต่ละ test case ประกอบด้วยตัวแปร 3 ตัว ( นั่นคือ B P M) โดยแต่ละตัวถูกอ่าน เข้ามาทีละบรรทัด โดยที่ B เป็นจำนวนเต็มช่วง 1 ถึง P เป็นจำนวนเต็มช่วง 0 ถึง และ M เป็นจำนวนเต็มจาก 1 ถึง เมื่อข้อมูลครบ 1 test case จะถูกคั่นด้วยบรรทัดว่าง เอาท์พุท แสดงผลลัพธ์ในแต่ละ test case โดย 1 บรรทัดแสดง 1 test case
Sample InputSample Output
B P = B 1 * B 2 * … * B P B P % M = (B 1 * B 2 * … * B P ) % M = ( B 1 % M ) * ( B 2 % M ) * … * ( B P % M )%M - ถ้าคิดโดยการวนรอบจาก B 1 ถึง B P จะสามารถ หาค่าได้แต่ใช้เวลาในการคำนวณขึ้นกับค่า p โดย ยิ่งค่า p ยิ่งมากทำให้เวลาการคำนวณยิ่งมากตาม ไปด้วย - จากโจทย์ต้องการให้คำนวณให้หาค่าจาก test case ทั้งหมดโดยใช้เวลาแค่ 1 นาที ซึ่งค่า p มี ค่าสูงสุดคือ 2 พันล้าน (Max int) ซึ่งจะทำให้ต้อง วนลูป 2 พันล้านครั้ง
B 10 B5B5 B5B5 B2B2 B2B2 B BB ตัวอย่างการหาค่า B 10 % M กำหนดให้ x 1 = B % M x 2 = ( (x 1 * x 1 )% M )* x1)%M x 3 = (x 2 * x 2 )% M x 4 = (x 3 * x 3 )% M x1x1 x2x2 x3x3 x4x4
ดังนั้น x 1 = B % M x 2 = ( (x 1 * x 1 )% M )* x1)%M = B 2 % M x 3 = (x 2 * x 2 )% M = B 5 % M x 4 = (x 3 * x 3 )% M = B 10 % M วน 5 รอบ P = 20 วน 6 รอบ P = 40 วน 7 รอบ P = 80 วน 8 รอบ P = 160 วน x รอบ เมื่อ x = 1+log 2 P นั่นคือ วน 32 รอบ จะสามารถหาค่า P = 4 พันล้านได้
โจทย์ (3 วินาที ) ยูอิไปเที่ยวงานนิทรรศการวิทยาศาสตร์ที่โตเกียว ในงานมีหุ่นยนต์ชื่อ มิโกะ -12 ซึ่งถูกพัฒนาให้มี ระบบ AI( ปัญญาประดิษฐ์ ) ในการช่วยคิด เมื่อยุอิเห็นจึงคิดจะแกล้งหุ่นยนต์ เธอถามมิโกะว่า เธอรู้จัก คณิตศาสตร์ป่าว มิโกะตอบทันทีว่า “ แน่นอนฉันรักคณิตศาสตร์ ” แล้วยูอิจึงเริ่มปฎิบัติการลองภูมิมิโกะทันที “ ถ้าฉันให้ตัวเลขกับเธอ เธอจะหา แฟคทอเรียล (factorial) ของมันได้ใช่ไม๊ แต่จริงๆ แล้วฉันไม่ได้อยากรู้แฟคทอเรียลหรอก ฉันอยากรู้ว่า จำนวน หลักของผลลัพธ์ที่ไม่ใช่ศูนย์ที่ได้จากแฟคทอเรียลเท่ากับเท่าไหร่หน่ะ ” สมมตินะ ถ้าฉันให้ตัวเลข 5 กับเธอ แฟคทอเรียลของมันคือ 120 ใช่ป่ะ เธอต้องหาจำนวนหลักที่ ไม่ใช่ศูนย์ของ 120 ซึ่งก็คือ 1 และ 2 ดังนั้น ให้เธอตอบ 2 มิโกะตอบว่า “ ใช่ ฉันทำได้ ” จากนั้น ยูอิเริ่มถามมิโกะว่า 100 มิโกะเริ่มคิดประมาณ 2 3 นาที แล้วก็ร้องไห้เสียงดัง พร้อมกับพูดว่า "Time Limit Exceeds" ยูอิหัวเราะและก็บอกกับมิโกะว่า ผลรวมคือ 648 มิโกะงง พร้อมกับถามว่า เธอรู้ได้ไง ยูอิบอกว่า ฉันมาจากการแข่งขัน ACM World Finalist และฉันก็สามารถแก้ปัญหาข้อ Big Number problems ได้แล้วยูอิก็หิ้วโน๊ตบุ๊คเดินจากไป ตอนนี้ งานของคุณคือช่วยเขียนโปรแกรมเพื่อช่วยมิโกะให้คิดคำตอบนี้ให้ได้ อินพุท อินพุทแต่ละบรรทัดเป็นตัวเลขที่ต้องหา factorial (integer n, n<=1000). เอาท์พุท แต่ละบรรทัดแสดงจำนวนตัวเลขที่ไม่ใช่ศูนย์จากค่า factorial ของอินพุท
Sample InputSample Output Sample InputSample Output
ความยากของข้อนี้คือ การเก็บค่าของ factorial(n) เมื่อ n มีค่าตั้งแต่ 1 ถึง 1000 โดย เมื่อ n ตั้งแต่ 100 เป็นต้นไป การประกาศ data type long จะไม่สามารถเก็บได้ วิธีการคือ ใช้ data type int ก็พอ แต่ให้เก็บเป็น บล็อก array โดยให้ array แต่ละหลักมีค่าไม่เกิน 1 ล้าน ถ้า เกินให้เก็บไว้ในบล็อก array ใหม่
!9! ! 11! *3 11* ! 0
Sample InputSample Output 4 * * ** *... 0 Field #1: * * Field #2: ** *100
public static int getMine(int s1,int s2,int h,int w,String[][] m){ int num = 0,mini = 0,minj = 0,maxi = h,maxj = w; if (s1==0) mini = 0; else mini = s1-1; if (s1==h-1) maxi = h-1; else maxi = s1+1; if (s2==0) minj = 0; else minj = s2-1; if (s2==w-1) maxj = w-1; else maxj = s2+1; for (int i = mini; i <= maxi; i++) { for (int j = minj; j <= maxj; j++) { if ( ( i!= s1 || j!= s2 ) && m[i][j].equals("*") ){ num++; } return num; } public static void main(String[] args) { Scanner s = new Scanner(System.in); int h = s.nextInt(); int w = s.nextInt(); while(w!= 0 || h!= 0){ String[][] m = new String[h][w]; for (int i = 0; i < h; i++) { String[] tmp = s.next().split(""); for (int j = 0; j < tmp.length-1; j++) { m[i][j] = tmp[j+1]; } for (int i = 0; i < h; i++) { for (int j = 0; j < w; j++) { if (!m[i][j].equals("*")){ System.out.print(getMine(i,j,h,w,m)); }else System.out.print("*"); } System.out.println(); } h = s.nextInt(); w = s.nextInt(); }