https://www.devskill.com/CodingProblems/ViewProblem/191
সহজ একটি প্রবলেম , কিন্তু - কে কতটা এফিসিয়েন্ট ভাবে করতে পারবে ? সেটাই দেখার বিষয় .
এই প্রোবলেম এর জন্য একটা বিষয় মাথায় রাখতে হবে ,
তোমায় যদি বলে ? 1 থেকে 100 অবদি 9 এর কয়টি গুণিতক আছে/ কয়টি সংখ্যা 9 দিয়ে নিঃশেষে বিভাজ্য হবে ?? তাহলে , কিন্তু লুপ চালানোর দরকার নেই , ১০০ কে ৯ দিয়ে ভাগ করলেই উত্তর পেয়ে যাবো ।
এখন আসি প্রোবলেম -এ , ধরো তোমায় বললো ৩ ডিজিট এর কয়টি সংখ্যা ৩ দিয়ে নিঃশেষে বিভাজ্য হবে ?? ৩ ডিজিট মানে (10^3 -1) = 999 পর্যন্ত চেক করতে হবে , তাই তো ?? কিন্তু , তুমি যদি - ৯৯৯ কে ৩ দিয়ে ভাগ দেও , তাহলে - একেবারে ১ থেকে ৯৯৯ পর্যন্ত কয়টা ৩ এর গুণিতক ? সেটা বের হবে ।
কিন্তু , আমার তো দরকার শুধু ৩ ডিজিট এর কয়টা সংখ্যা ৩ দিয়ে বিভাজ্য , তার পরিমাণ । তাইলে , কি করা যায় ?? হুম , একটা বুদ্ধি আছে - ( 10^(3-1) -1 ) = 99 পর্যন্ত যে কয়টা ৩ এর গুণিতক আছে , সেটা বের করে - ১ থেকে ৯৯৯ পর্যন্ত কয়টা ৩ এর গুণিতক আছে ,সেটা থেকে বাদ দিলেই কিন্তু - ১০০ থেকে ৯৯৯ পর্যন্ত কয়টি সংখ্যা ৩ এর গুণিতক ? সেটা বের হয়ে যাবে ,অর্থাৎ আমরা ৩ ডিজিট এর কয়টা সংখ্যা ৩ এর গুণিতক ? সেটা পেয়ে যাবো , তাই না ?? চলো , এবার তাহলে ইমপ্লিমেন্ট করে ফেলি - কোড দেখি চলো ------------------
#include<iostream>
#include<cstdio>
#define ll long long
using namespace std;
ll powr(ll a,ll b)
{
ll p=1;
for(int i=0;i<b;i++)p=p*a;
return p;
}
int main()
{
ll t,n,k,c;
ll a,b,d,e;
scanf("%lld",&t);
while(t--){
a=0;
b=0;
c=0;
scanf("%lld %lld",&n,&k);
a=powr(10,n-1);
b=(a*10)-1;
d=(a-1)/k;
e=b/k;
c=e-d;
printf("%lld\n",c);
}
return 0;
}
সহজ একটি প্রবলেম , কিন্তু - কে কতটা এফিসিয়েন্ট ভাবে করতে পারবে ? সেটাই দেখার বিষয় .
এই প্রোবলেম এর জন্য একটা বিষয় মাথায় রাখতে হবে ,
তোমায় যদি বলে ? 1 থেকে 100 অবদি 9 এর কয়টি গুণিতক আছে/ কয়টি সংখ্যা 9 দিয়ে নিঃশেষে বিভাজ্য হবে ?? তাহলে , কিন্তু লুপ চালানোর দরকার নেই , ১০০ কে ৯ দিয়ে ভাগ করলেই উত্তর পেয়ে যাবো ।
এখন আসি প্রোবলেম -এ , ধরো তোমায় বললো ৩ ডিজিট এর কয়টি সংখ্যা ৩ দিয়ে নিঃশেষে বিভাজ্য হবে ?? ৩ ডিজিট মানে (10^3 -1) = 999 পর্যন্ত চেক করতে হবে , তাই তো ?? কিন্তু , তুমি যদি - ৯৯৯ কে ৩ দিয়ে ভাগ দেও , তাহলে - একেবারে ১ থেকে ৯৯৯ পর্যন্ত কয়টা ৩ এর গুণিতক ? সেটা বের হবে ।
কিন্তু , আমার তো দরকার শুধু ৩ ডিজিট এর কয়টা সংখ্যা ৩ দিয়ে বিভাজ্য , তার পরিমাণ । তাইলে , কি করা যায় ?? হুম , একটা বুদ্ধি আছে - ( 10^(3-1) -1 ) = 99 পর্যন্ত যে কয়টা ৩ এর গুণিতক আছে , সেটা বের করে - ১ থেকে ৯৯৯ পর্যন্ত কয়টা ৩ এর গুণিতক আছে ,সেটা থেকে বাদ দিলেই কিন্তু - ১০০ থেকে ৯৯৯ পর্যন্ত কয়টি সংখ্যা ৩ এর গুণিতক ? সেটা বের হয়ে যাবে ,অর্থাৎ আমরা ৩ ডিজিট এর কয়টা সংখ্যা ৩ এর গুণিতক ? সেটা পেয়ে যাবো , তাই না ?? চলো , এবার তাহলে ইমপ্লিমেন্ট করে ফেলি - কোড দেখি চলো ------------------
#include<iostream>
#include<cstdio>
#define ll long long
using namespace std;
ll powr(ll a,ll b)
{
ll p=1;
for(int i=0;i<b;i++)p=p*a;
return p;
}
int main()
{
ll t,n,k,c;
ll a,b,d,e;
scanf("%lld",&t);
while(t--){
a=0;
b=0;
c=0;
scanf("%lld %lld",&n,&k);
a=powr(10,n-1);
b=(a*10)-1;
d=(a-1)/k;
e=b/k;
c=e-d;
printf("%lld\n",c);
}
return 0;
}
No comments:
Post a Comment