https://uva.onlinejudge.org/index.php?option=onlinejudge&page=show_problem&problem=1889
খুবই মজার একটা সমস্যা , তোমায় একটা সংখ্যা দেয়া থাকবে । সেটাকে , দুইটা মৌলিক সংখ্যার
যোগফল হিসেবে , তোমায় প্রকাশ করতে হবে । । ধরো ,দেয়া আছে ১০ ,
তাহলে , ১০ = ৩ + ৭
১০ = ৫ + ৫
এখানে ১০ কে এই দুই ভাবেই কিন্তু লেখা যায় , তাই না ?? কিন্তু , আমাদের প্রথমটাই বেছে নিতে হবে , কারণ , ৩ ও ৭ এর মাঝের ডিফারেন্স ৫ ও ৫ এর মাঝে ডিফারেন্স থেকে বড়ো , তাই আমরা প্রথমটাকেই বেছে নেবো ।
এখন আরো কিছু বিষয় লক্ষ রাখতে হবে , আমাদের ---
১) ২ ছাড়া বাকি সব মৌলিক সংখ্যাই , বিজোড় সংখ্যা ।
২) যদি , ইনপুটে কোনো বিজোড় সংখ্যা দেয়া থাকে , তাহলে তোমায় বুঝতে হবে যে --- এটা কে ২ টা মৌলিক সংখ্যার যোগফল হিসেবে প্রকাশ করা যাবে না , কারণ -- ২ টা মোলিক সংখ্যা যোগ করলে সবসময় জোড় হবে , বিজোড় হবে না । শুধু , ২ এবং অন্য কোনো মৌলিক সংখ্যা দিয়ে যদি প্রকাশ করা যায় , তাহলে সেটা আলাদা কথা ।
৩) আর যদি , কোনো জোড় সংখ্যা (N) থাকে ইনপুটে , তাহলে --- i=3 থেকে শুরু করে লুপ ঘুরাবো , যেখানে যেয়ে N-i & i মৌলিক সংখ্যা হবে , সেটাই হবে উত্তর ।
মৌলিক সংখ্যা চেক করার জন্য আলদা , একটা ফাংশন কিন্তু বানিয়েই রাখবো ।।
চলো , এবার যা যা বুঝলাম একটু কষ্ট করে ইমপ্লিমেন্ট করে আসি
#include<bits/stdc++.h>
using namespace std;
bool isprime(int t)
{
int i,val;
val = sqrt(t);
for(i=2;i<=val;i++)
{
if((t%i)==0)
return false;
}
return true;
}
int main()
{
int n,i;
while(scanf("%d",&n) && n)
{
if(n%2==1)
{
if(isprime(n-2))
{
cout << n << ':' << '\n' << 2 << '+' << n-2 << '\n';
}
else
cout << n << ':' << '\n' << "NO WAY!" <<"\n";
}
else
{
for(i=3;i<=n;i++)
{
if(isprime(i) && isprime(n-i))
{
cout << n << ':' << '\n' << i << '+' << n-i <<"\n";
break;
}
}
}
}
return 0;
}
খুবই মজার একটা সমস্যা , তোমায় একটা সংখ্যা দেয়া থাকবে । সেটাকে , দুইটা মৌলিক সংখ্যার
যোগফল হিসেবে , তোমায় প্রকাশ করতে হবে । । ধরো ,দেয়া আছে ১০ ,
তাহলে , ১০ = ৩ + ৭
১০ = ৫ + ৫
এখানে ১০ কে এই দুই ভাবেই কিন্তু লেখা যায় , তাই না ?? কিন্তু , আমাদের প্রথমটাই বেছে নিতে হবে , কারণ , ৩ ও ৭ এর মাঝের ডিফারেন্স ৫ ও ৫ এর মাঝে ডিফারেন্স থেকে বড়ো , তাই আমরা প্রথমটাকেই বেছে নেবো ।
এখন আরো কিছু বিষয় লক্ষ রাখতে হবে , আমাদের ---
১) ২ ছাড়া বাকি সব মৌলিক সংখ্যাই , বিজোড় সংখ্যা ।
২) যদি , ইনপুটে কোনো বিজোড় সংখ্যা দেয়া থাকে , তাহলে তোমায় বুঝতে হবে যে --- এটা কে ২ টা মৌলিক সংখ্যার যোগফল হিসেবে প্রকাশ করা যাবে না , কারণ -- ২ টা মোলিক সংখ্যা যোগ করলে সবসময় জোড় হবে , বিজোড় হবে না । শুধু , ২ এবং অন্য কোনো মৌলিক সংখ্যা দিয়ে যদি প্রকাশ করা যায় , তাহলে সেটা আলাদা কথা ।
৩) আর যদি , কোনো জোড় সংখ্যা (N) থাকে ইনপুটে , তাহলে --- i=3 থেকে শুরু করে লুপ ঘুরাবো , যেখানে যেয়ে N-i & i মৌলিক সংখ্যা হবে , সেটাই হবে উত্তর ।
মৌলিক সংখ্যা চেক করার জন্য আলদা , একটা ফাংশন কিন্তু বানিয়েই রাখবো ।।
চলো , এবার যা যা বুঝলাম একটু কষ্ট করে ইমপ্লিমেন্ট করে আসি
#include<bits/stdc++.h>
using namespace std;
bool isprime(int t)
{
int i,val;
val = sqrt(t);
for(i=2;i<=val;i++)
{
if((t%i)==0)
return false;
}
return true;
}
int main()
{
int n,i;
while(scanf("%d",&n) && n)
{
if(n%2==1)
{
if(isprime(n-2))
{
cout << n << ':' << '\n' << 2 << '+' << n-2 << '\n';
}
else
cout << n << ':' << '\n' << "NO WAY!" <<"\n";
}
else
{
for(i=3;i<=n;i++)
{
if(isprime(i) && isprime(n-i))
{
cout << n << ':' << '\n' << i << '+' << n-i <<"\n";
break;
}
}
}
}
return 0;
}
No comments:
Post a Comment