ای سی ام کار تازه وارد

در این وبلاگ مطالبی در مورد برخی الگوریتم ها و راهنمایی برای حل سوالات ارائه می گردد

ای سی ام کار تازه وارد

در این وبلاگ مطالبی در مورد برخی الگوریتم ها و راهنمایی برای حل سوالات ارائه می گردد

102 - Coprimes

دوشنبه, ۵ تیر ۱۳۹۱، ۰۵:۰۹ ق.ظ

لینک سوال


مفهوم سوال :

این سوال به عنوان ورودی یه عدد طبیعی n < 10000 میده و از ما تعداد اعداد طبیعی کوچکتر یا مساوی n که نسبت به n اول هستن رو بدست بیاریم .

دو عدد رو نسبت به هم اول میگیم ، اگه ب.م.م اعداد 1 باشه .

حل: 


با توجه به محدوده n ، چند روش برای حل داریم :

یک روش اینکه کاملا navie عمل کنیم ، یعنی هر بار n رو از ورودی بگیریم و برای همه اعداد کوچکتر یا مساوی n ، ب.م.م رو بدست بیاریم .

تابع بازگشتر اویلر برای بدست آوردن ب.م.م Log N زمان می بره ، و چون n تا عدد داریم  order میشه  : N log N

در روش دوم به جای شمردن اعدای که نسبت به n اول اند ، تعداد divisor های n رو بدست میاریم .

برای این کار :

یه آرایه می گیریم که از اول همه صفر هستن .

بعد شروع می کنیم به جلو رفتن رو آرایه ، در هر بار مقدار اندیس هایی که به محل فعلی بخشپذیرند رو یکی اضافه می کنیم .

جواب مساله میشه : N - array[N] 

تو این سوال روش اول بهتره ، ولی در حالت کلی ، زمانیکه تعداد query ها بالا باشه ، بهتره از این روش تمام جواب ها رو از قبل بدست بیارید و با 1 order  ازشون استفاده کنید.


موافقین ۰ مخالفین ۰ ۹۱/۰۴/۰۵
رضا حسینی آشتیانی acm.sgu.ru - 102 - coprime

نظرات  (۰)

هیچ نظری هنوز ثبت نشده است

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی