Friday, July 14, 2017

DCP-191: Counting Multiples Devskill Problem Solution & Logic

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;
}

No comments:

Post a Comment