http://www.lightoj.com/volume_showproblem.php?problem=1136
একটু ঝামেলার একটি প্রোব্লেম ,তারপরো চাইলে - বিষয়টা খুবই আনন্দদায়ক ।
প্রথমেই লক্ষ করি , যে - তিনটি ক্রমিক সংখ্যার যোগফল সবসময় ৩ দিয়ে বিভাজ্য হয় ।
যেমন, x + ( x+1) + ( x+2) == 3x + 3 = 3(x+1)
3(x+1) সংখ্যাটি যেহেতু , ৩ এর গুনিতক । সুতরাং , সংখ্যাটি অবশ্যাই ৩ দিয়ে বিভাজ্য ।
এখন প্রোবলেম-এ বলা আছে যে- একটা সিকুয়েন্স এর কথা ,যেটা ক্রমিকতা বজায় রেখে বাড়তে থাকবে
১ , ১২ , ১২৩ , ১২৩৪ , ১২৩৪৫ , ১২৩৪৫৬ ..................
১ম ২য় ৩য় ৪র্থ ৫ম ৬ষ্ঠ
তোমাকে ইনপুট-এ দুইটা সংখ্যা দেয়া থাকবে , যেমন ৩ ও ৫ এর মানে হলো , তোমায় বুঝতে হবে - এই সিকুয়েন্স এর ৩য় ও ৫ম তম সংখ্যা'গুলির মাঝে কয়টি সংখ্যা পাওয়া যাবে (৩য় ও ৫ম সংখ্যা সহ ) , যেটা ৩ দিয়ে বিভাজ্য হবে ??
এখন আমরা জানি যে , প্রত্যেক'টি ত্রয়ী'তে যেমন - ( ১ , ১২ , ১২৩ ) [ তিন'টি মিলে একটি ত্রয়ী ]
এমন একটি ,সংখ্যা থাকে ( এখানে, ১২৩ ) যেটা তিন'টি ক্রমিক সংখ্যা দিয়ে গঠিত । অর্থাৎ , এদের যোগফল হবে - x + ( x+1) + ( x+2) == 3x + 3 = 3(x+1) যা, ৩ দিয়ে বিভাজ্য । ডিজিট'গুলির যোগফল যদি ৩ দিয়ে বিভাজ্য হয় , তাহলে সংখ্যাটি'ও ৩ দিয়ে বিভাজ্য হবে অর্থাৎ , ১২৩ অবশ্যই ৩ দিয়ে বিভাজ্য হবে ।খেয়াল করে দেখো , প্রথম ত্রয়ী'র মধ্যে - ১২ ও দ্বিতীয় ত্রয়ী'র মধ্যে ১২৩৪৫ , ৩ দ্বারা বিভাজ্য - এরকমভাবে প্রত্যেক ত্রয়ীর মধ্যেই মোট ২ টা করে সংখ্যা থাকবে - যেটা ৩ দিয়ে বিভাজ্য হবে ।
অর্থাৎ , তাহলে তোমাকে বুঝতে হবে - তোমাকে যে ইনপুট দেয়া হবে - ধরো, ৬ এর মানে ৬ পর্যন্ত এরকম ত্রয়ী আছে ৬ / ৩ = ২ টা , আর প্রত্যেক ত্রয়ী'তে যেহেতু, ২ টা করে সংখ্যা ৩ দ্বারা বিভাজ্য - সুতরাং , এখানেও তাহলে ৬ষ্ঠ অবদি , মোট ২x২ = ৪ টা সংখ্যা ৩ দিয়ে বিভাজ্য , বিশ্বাস না হলে চেক করে দেখো । আর , ধরো , ইনপুট দিলো - ৫ তাহলে ত্রয়ী আছে ৫/৩=১ টা , মোট ৩ দ্বরা বিভাজ্য সংখ্যা আছে ১*২ == ২ টা !! কিন্তু , আসলে কিন্তু নয়- কারণ ,আরো একটা ত্রয়ী'র ২য় সংখ্যা এখানে ঢূকে গেছে , তাই - মোট ৩ দ্বারা বিভাজ্য সংখ্যা হবে ২+১=৩ টা , ৫ম সংখ্যা অবদি । অরথাত, ভাগশেষ ২ হলে (৫%৩==২) আরো এক যোগ করতে হবে , আমাদের । তাহলে , এবার একটু কোড'টা দেখে ফেলি , নাকি ???
#include<bits/stdc++.h>
//Nayeem Mollick Joy, Applied physics & Electronic Engineering , University of Rajshahi.
using namespace std;
int divisiblecount(int n) {
if (n==0) {
return 0;
}
int ans = (n / 3) * 2;
if (n % 3 == 2)
{
ans=ans+1;
}
return ans;
}
int main() {
int T, cases = 1, a, b;
scanf("%d", &T);
while (T--) {
scanf("%d %d", &a, &b);
printf("Case %d: %d\n", cases++ , divisiblecount(b) - divisiblecount(a - 1));
}
return 0;
}
একটু ঝামেলার একটি প্রোব্লেম ,তারপরো চাইলে - বিষয়টা খুবই আনন্দদায়ক ।
প্রথমেই লক্ষ করি , যে - তিনটি ক্রমিক সংখ্যার যোগফল সবসময় ৩ দিয়ে বিভাজ্য হয় ।
যেমন, x + ( x+1) + ( x+2) == 3x + 3 = 3(x+1)
3(x+1) সংখ্যাটি যেহেতু , ৩ এর গুনিতক । সুতরাং , সংখ্যাটি অবশ্যাই ৩ দিয়ে বিভাজ্য ।
এখন প্রোবলেম-এ বলা আছে যে- একটা সিকুয়েন্স এর কথা ,যেটা ক্রমিকতা বজায় রেখে বাড়তে থাকবে
১ , ১২ , ১২৩ , ১২৩৪ , ১২৩৪৫ , ১২৩৪৫৬ ..................
১ম ২য় ৩য় ৪র্থ ৫ম ৬ষ্ঠ
তোমাকে ইনপুট-এ দুইটা সংখ্যা দেয়া থাকবে , যেমন ৩ ও ৫ এর মানে হলো , তোমায় বুঝতে হবে - এই সিকুয়েন্স এর ৩য় ও ৫ম তম সংখ্যা'গুলির মাঝে কয়টি সংখ্যা পাওয়া যাবে (৩য় ও ৫ম সংখ্যা সহ ) , যেটা ৩ দিয়ে বিভাজ্য হবে ??
এখন আমরা জানি যে , প্রত্যেক'টি ত্রয়ী'তে যেমন - ( ১ , ১২ , ১২৩ ) [ তিন'টি মিলে একটি ত্রয়ী ]
এমন একটি ,সংখ্যা থাকে ( এখানে, ১২৩ ) যেটা তিন'টি ক্রমিক সংখ্যা দিয়ে গঠিত । অর্থাৎ , এদের যোগফল হবে - x + ( x+1) + ( x+2) == 3x + 3 = 3(x+1) যা, ৩ দিয়ে বিভাজ্য । ডিজিট'গুলির যোগফল যদি ৩ দিয়ে বিভাজ্য হয় , তাহলে সংখ্যাটি'ও ৩ দিয়ে বিভাজ্য হবে অর্থাৎ , ১২৩ অবশ্যই ৩ দিয়ে বিভাজ্য হবে ।খেয়াল করে দেখো , প্রথম ত্রয়ী'র মধ্যে - ১২ ও দ্বিতীয় ত্রয়ী'র মধ্যে ১২৩৪৫ , ৩ দ্বারা বিভাজ্য - এরকমভাবে প্রত্যেক ত্রয়ীর মধ্যেই মোট ২ টা করে সংখ্যা থাকবে - যেটা ৩ দিয়ে বিভাজ্য হবে ।
অর্থাৎ , তাহলে তোমাকে বুঝতে হবে - তোমাকে যে ইনপুট দেয়া হবে - ধরো, ৬ এর মানে ৬ পর্যন্ত এরকম ত্রয়ী আছে ৬ / ৩ = ২ টা , আর প্রত্যেক ত্রয়ী'তে যেহেতু, ২ টা করে সংখ্যা ৩ দ্বারা বিভাজ্য - সুতরাং , এখানেও তাহলে ৬ষ্ঠ অবদি , মোট ২x২ = ৪ টা সংখ্যা ৩ দিয়ে বিভাজ্য , বিশ্বাস না হলে চেক করে দেখো । আর , ধরো , ইনপুট দিলো - ৫ তাহলে ত্রয়ী আছে ৫/৩=১ টা , মোট ৩ দ্বরা বিভাজ্য সংখ্যা আছে ১*২ == ২ টা !! কিন্তু , আসলে কিন্তু নয়- কারণ ,আরো একটা ত্রয়ী'র ২য় সংখ্যা এখানে ঢূকে গেছে , তাই - মোট ৩ দ্বারা বিভাজ্য সংখ্যা হবে ২+১=৩ টা , ৫ম সংখ্যা অবদি । অরথাত, ভাগশেষ ২ হলে (৫%৩==২) আরো এক যোগ করতে হবে , আমাদের । তাহলে , এবার একটু কোড'টা দেখে ফেলি , নাকি ???
#include<bits/stdc++.h>
//Nayeem Mollick Joy, Applied physics & Electronic Engineering , University of Rajshahi.
using namespace std;
int divisiblecount(int n) {
if (n==0) {
return 0;
}
int ans = (n / 3) * 2;
if (n % 3 == 2)
{
ans=ans+1;
}
return ans;
}
int main() {
int T, cases = 1, a, b;
scanf("%d", &T);
while (T--) {
scanf("%d %d", &a, &b);
printf("Case %d: %d\n", cases++ , divisiblecount(b) - divisiblecount(a - 1));
}
return 0;
}
Nice explanation. Thanks
ReplyDeleteWelcome
DeleteThanks
ReplyDeletevai, Why did you do a--? Could you please, explain?
ReplyDelete