https://toph.co/p/laali-vs-bessie
if(i is equal to the smallest divisor of M and N>=i ) { //1 is not considered as a divisor
M = M / i;
N = N - i;
}
এই অংশটুকু ভালো করে বুঝতে হবে , তাহলেই মোটামুটি সল্ভ করার মতো চিন্তা করতে পারবা । তোমায় ২ টা
মান দেয়া থাকবে , N & M তোমায় একটা লুপ ঘুরাতে হবে - ২ থেকে শুরু করে । যখনি -
M এর একটা করে গুণনীয়ক পাবা - ঠিক তখনই উপরে ব্র্যাকেটের ভেতরের কাজ গুলো করতে হবে আর যখনি দেখবা ,
M এর গুণনীয়ক
i ,
N এর চেয়ে বড় হয়ে যাবে ঠিক তখনই লুপ ভেংগে যাবে । এইটুকু অবদি , সবাই বুঝতে পারবে
কিন্তু - সমস্যা আছে আমরা যখন লুপ ঘুরাবো তখন কিন্তু ,
M এর sqrt মান অবদি ঘুরাবো - তাহলে আমাদের সময় কম লাগবে
কিন্তু , মাঝে মধ্যে দেখা যায় - একটু সমস্যা , যেমন উদাহরণ দিয়ে বুঝাই ,চলো -
ধরো , দেয়া আছে
N & M এর মান
10 ও 10 । তাহলে , যখন লুপ এi এর মান ২ দিয়ে শুরূ করবো তখন
প্রথমে , M = M/2 = 5
N = N-i = 8
হবে , তারপর আর হবে না , কারণ আমরা লুপ'টা ঘুরাবো
sqrt(M) = 3 অবদি , এরপরে আর ঘুরবে না , অথচ
5 নিজেই কিন্তু , একটা গুননীয়ক
5 এর ও N(8) >= i(5) অর্থাৎ আরো একধাপ কিন্তু বাকিই আছে । সুত্র অনুযায়ী
হবে , M = M / i(M=5) = 1
N = N - i(M=5) = 3
এটাই হলো - প্রত্যাশিত উত্তর - সো , এই তিন ধরনের ঘটনা যদি কেউ বুঝতে পারে , তাহলে নিচের কোড দেখে
আরো ক্লিয়ার হয়ে নাও , চলো -----------
#include<bits/stdc++.h>
using namespace std;
int main()
{
long long int n,m,i,j,x;
cin>>n>>m;
x=sqrt(m);
bool joy = false;
for(i=2;i<=x;i++)
{
if(m%i==0 && n>=i)
{
m = m/i ;
n = n-i ;
}
if(m%i==0)
{
joy = true ;
break;
}
}
if(m>1 && n>=m && joy==false )
{
n=n-m;
m=m/m;
}
cout<<n<<" "<<m<<endl;
return 0;
}
No comments:
Post a Comment