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

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

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

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

106 - The equation

يكشنبه, ۱۰ فروردين ۱۳۹۳، ۰۶:۳۷ ب.ظ
لینک سوال

مفهوم سوال
سوال به ما یه معادله به فرم a * x + b * y + c = 0 میده و از ما خواد ببینیم چند از جوابهای صیحی اون تو شرط x1 <= x <= x2 و  y1 <= y <= y2 صدق می کنند ؟

سوال به عنوان ورودی به ما a , b , c , x1 , x2 , y1 , y2 رو میده و از ما تعداد جوابهارو می خواد .
قدرمطلق همه اعداد کوچکتر از 108 است .

حل
اگر به صورت هندسی نگاه کنیم سوال از ما تعداد تقاطی از مشبکه اصلی ( دستگاه مختصات ) رو می خواد که داخل یا روی یک مستطیل داده شده اند .

مساله رو به چند قسمت تقسیم می کنیم :
اگر a = b = 0 باشه تو این حالت معداله تبدیل به یک نقطه میشه . حالا اگر c = 0 باشه ، تمام مستطیل داده شده جواب هستند و اگر نباشه مساله جواب نداره .

اگر a = 0 باشه ، معادله تبدیل میشه به b * y + c = 0  یا y = -c / b .
تو این حالت اگر خط y = -c / b مقداری صحیح داشته باشه ، مساله x2 - x1 + 1 جواب خواهد داشت وگرنه معادله بی جواب خواهد بود .

اگر b = 0 باشه به خط x = -c / a می رسیم و بسته به شرایط یا y2 - y1 + 1 جواب داریم یا جواب نداریم .

اگر a , b صفر نباشند .
برای بدست آوردن جواب ، یک جواب دلخواه رو در نظر می گیریم مثلا (x , y )
براحتی میشه دید که ( x+b , y-a ) هم یک جواب برای معادله هستند .

برای شمردن تعداد جواب ها اول دو ضلع عمودی مستطیل رو در نظر می گیریم .
کمترین تعداد shift لازم برای اینکه جواب دلخواه بین دو ضلع بیوفته رو بدست میاریم . اسمش رو L1 می زاریم .
همچنین بیشترین shift برای اینکه بین دو ضلع بیوفته رو بدست میاریم . اسمش رو R1 می زاریم .

حالا دو ضلع افقی مستطیل رو در نظر می گیریم .
کمترین و بیشترین تعداد shift برای بین دو ضلع موندن جواب دلخواه رو L2 , R2 می نامیم .

جواب مساله میشه min( R1 , R2 ) - max( L1 , L2 ) + 1
البته ممکنه مطاله جواب صحیح نداشته باشه ، تو این حالت عبارت فوق جواب منفی میده !!

برای بدست آوردن این مقادیر به صورت زیر کار می کنیم .
مثلا برای بدست آوردن L1 :
برای بدست آوردن جواب دلخواه می تونیم از Extended GCD استفاده کنیم .
این الگوریتیم جوابی برای معادله a * x + b * y = g به ما میده ، با ضرب طرفین در c / g یک جواب برای معادله اصلی خواهیم داشت .
حالا با داشتن یک جواب معادله می تونیم L1 رو حساب کنیم .
L1 = ( x1 - x ) * g / b ;
البته باید حواسمون باشه که اگر x1 - x ) * g ) به b بخشپذیر نباشه ، این رابطه اولین نقطه قبل از دو ضلع رو میده !!


موافقین ۲ مخالفین ۰ ۹۳/۰۱/۱۰
رضا حسینی آشتیانی 106 Equation acm.sgu.ru

نظرات  (۱)

من نفهمیدم
پاسخ:
سلام
کجاش رو نفهمیدی؟

ارسال نظر

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