পাইথ, 92 বাইট
I!%vzhK%2u?sm,ed-hd*ed/F<G2cG2@G1G+~Q,hQ_eQj9 2)J*L/vzhKtKeoSNm-VJ/RhK_*LdQsm+LdtM3/V*LhK_JQ
এটি বেশ দানব।
অনলাইনে চেষ্টা করুন: বিক্ষোভ । ইনপুট ফর্ম্যাটটি c\n[a,b]
এবং আউটপুট ফর্ম্যাটটি [x,y]
।
কোনও পূর্ণসংখ্যার সমাধান উপস্থিত না থাকায় আমি কিছুই প্রিন্ট করব না, এবং প্রাকৃতিক পূর্ণসংখ্যার সমাধান না থাকলে আমি কেবল একটি এলোমেলো পূর্ণসংখ্যার সমাধান মুদ্রণ করব।
ব্যাখ্যা (মোটামুটি ওভারভিউ)
প্রথমে আমি ax + by = gcd(a,b)
বর্ধিত ইউক্লিডিয়ান অ্যালগরিদম ব্যবহার করে সমীকরণের একটি পূর্ণসংখ্যার সমাধানটি সন্ধান করব ।
তারপরে একটি পূর্ণসংখ্যার সমাধান পেতে আমি সমাধানটি (আমার গুণিত a
এবং b
সাথে c/gcd(a,b)
) সংশোধন করব ax + by = c
। এটি c/gcd(a,b)
পূর্ণসংখ্যা হলে এটি কাজ করে । অন্যথায় একটি সমাধানের অস্তিত্ব নেই।
অন্যান্য সমস্ত পূর্ণসংখ্যা সমাধান ফর্ম আছে a(x+n*b/d) + b(y-n*a/d) = c
সঙ্গে d = gcd(a,b)
পূর্ণসংখ্যা জন্য n
। দুটি অসমতা ব্যবহার করে x+n*b/d >= 0
এবং y-n*a/d >= 0
আমি 6 টি সম্ভাব্য মানগুলি নির্ধারণ করতে পারি n
। আমি এগুলির 6 টির জন্য চেষ্টা করব এবং সর্বাধিক নিম্নতম সহগ সহ সমাধানটি মুদ্রণ করব।
ব্যাখ্যা (বিস্তারিত)
প্রথম পদক্ষেপটি হল সমীকরণের একটি পূর্ণসংখ্যা সমাধান অনুসন্ধান করা ax' + by' = gcd(a,b)
। এটি বর্ধিত ইউক্লিডিয়ান অ্যালগরিদম ব্যবহার করে করা যেতে পারে। উইকিপিডিয়ায় এটি কীভাবে কাজ করে সে সম্পর্কে আপনি একটি ধারণা পেতে পারেন । পার্থক্যটি হ'ল, 3 টি কলাম ( r_i s_i t_i
) ব্যবহার করার পরিবর্তে আমি 6 টি কলাম ( r_i-1 r_i s_i-1 s_i t_i-1 t_i
) ব্যবহার করব । এইভাবে আমাকে শেষ দুটি সারি স্মৃতিতে রাখতে হবে না, কেবল সর্বশেষটি।
K%2u?sm,ed-hd*ed/F<G2cG2@G1G+~Q,hQ_eQj9 2) implicit: Q = [a,b] (from input)
j9 2 convert 9 to base 2: [1,0,0,1]
+ Q add to Q => [a,b,1,0,0,1]
this is the initial row
u ) start with G = ^ and update G repeatedly
by the following expression, until
the value of G doesn't change anymore
? @G1 if G[1] != 0:
cG2 split G into parts of 2
m map the parts d to:
, the pair
ed d[1]
-hd*ed/F<G2 d[0]-d[1]*G[0]/G[1]
s unfold
else:
G G (don't change it, stop criterion for u)
%2 take every second element
we get the list [gcd(a,b),x',y']
K store this list in K
~Q,hQ_eQ afterwards change Q to [Q[0],-Q[1]] = [a,-b]
This will be important for the other parts.
এখন আমি এর সমাধান খুঁজতে চাই ax + by = c
। এটি কেবল তখনই সম্ভব, যখন c mod gcd(a,b) == 0
। এই সমীকরণ সন্তুষ্ট হয়, তাহলে আমি কেবল গুন x',y'
সঙ্গে c/gcd(a,b)
।
I!%vzhK...J*L/vzhKtK implicit: z = c in string format (from input)
%vzhK evaluated(z) mod K[0] (=gcd(a,b))
I! if not ^ than:
/vzhK c/K[0]
*L tK multipy ^ to each element in K[1:] (=[x',y'])
J and store the result in J, this is now [x,y]
আমাদের জন্য একটি পূর্ণসংখ্যা সমাধান রয়েছে ax + by = c
। লক্ষ্য করুন, যে x
, y
বা উভয়ই নেতিবাচক হতে পারে। সুতরাং আমাদের লক্ষ্য এগুলি অ-নেতিবাচক রূপান্তর করা to
ডায়োফানটাইন সমীকরণ সম্পর্কে দুর্দান্ত জিনিসটি হ'ল, আমরা কেবলমাত্র একটি প্রাথমিক সমাধান ব্যবহার করে সমস্ত সমাধান বর্ণনা করতে পারি। যদি (x,y)
কোনও সমাধান হয়, তবে অন্যান্য সমস্ত সমাধান পূর্ণসংখ্যার (x-n*b/gcd(a,b),y+n*a/gcd(a,b))
জন্য ফর্মের n
।
অতএব আমরা খুঁজে পেতে চান n
, যেখানে x-n*b/gcd(a,b) >= 0
এবং y+n*a/gcd(a,b >= 0
। কিছু রূপান্তরের পরে আমরা দুটি অসমতার সাথে শেষ করি n >= -x*gcd(a,b)/b
এবং n >= y*gcd(a,b)/a
। লক্ষ্য করুন যে অসমতার প্রতীকটি সম্ভাব্য নেতিবাচক a
বা বিভাগের সাথে বিভাজনের কারণে অন্য দিকে তাকিয়ে থাকতে পারে b
। আমি এটির বিষয়ে খুব বেশি চিন্তা করি না, আমি কেবলই বলে থাকি যে একটি সংখ্যা নির্দিষ্টভাবে -x*gcd(a,b)/b - 1, -x*gcd(a,b)/b, -x*gcd(a,b)/b + 1
অসমতাকে সন্তুষ্ট করে 1, এবং একটি সংখ্যা অসম্পূর্ণতাকে সন্তুষ্ট করে y*gcd(a,b)/a - 1, y*gcd(a,b)/a, y*gcd(a,b)/a + 1
২. এটি একটিn
উভয় বৈষম্যকে সন্তুষ্ট করে 6 সংখ্যার মধ্যে একটিও করে।
তারপরে আমি (x-n*b/gcd(a,b),y+n*a/gcd(a,b))
সমস্ত 6 টি সম্ভাব্য মানগুলির জন্য নতুন সমাধানগুলি গণনা করি n
। এবং আমি সর্বাধিক সর্বনিম্ন মান সহ সমাধানটি মুদ্রণ করি।
eoSNm-VJ/RhK_*LdQsm+LdtM3/V*LhK_JQ
_J reverse J => [y,x]
*LhK multiply each value with K[0] => [y*gcd,x*gcd]
/V Q vectorized division => [y*gcd/a,-x*gcd/b]
m map each d of ^ to:
tM3 [-1,0,1]
+Ld add d to each ^
s unfold
these are the possible values for n
m map each d (actually n) of ^ to:
*LdQ multiply d to Q => [a*n,-b*n]
_ reverse => [-b*n,a*n]
/RhK divide by K[0] => [-b*n/gcd,a*n/gcd]
-VJ vectorized subtraction with J
=> [x+b*n/gcd,y-a*n/gcd]
oSN order the solutions by their sorted order
e print the last one
তাদের বাছাই করা অর্ডার জিনিস অনুসারে বাছাই করা নিম্নলিখিত পদ্ধতিতে কাজ করে। আমি উদাহরণ ব্যবহার করছি2x + 3y = 11
আমি solutions টি সমাধানের প্রত্যেককে বাছাই করি (এগুলিকে কী বলা হয়), এবং তাদের কীগুলি দ্বারা মূল সমাধানগুলি সাজান:
solutions: [1, 3], [4, 1], [7, -1], [-5, 7], [-2, 5], [1, 3]
keys: [1, 3], [1, 4], [-1, 7], [-5, 7], [-2, 5], [1, 3]
sort by key:
solutions: [-5, 7], [-2, 5], [7, -1], [1, 3], [1, 3], [4, 1]
keys: [-5, 7], [-2, 5], [-1, 7], [1, 3], [1, 3], [1, 4]
এটি শেষের জন্য সম্পূর্ণ অ-নেতিবাচক সমাধান বাছাই করে (যদি থাকে তবে)।