Saturday, September 30, 2017

1282 - Leading and Trailing

/***

            Bismillahir Rahmanir Rahim
            Read the name of Allah, who created you!!!
            Author : Shah Newaj Rabbi Shishir
            Department of CSE, City University, Bangladesh.

***/

#include <bits/stdc++.h>
using namespace std;

#define sf scanf
#define pf printf
#define fast ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define scase sf ("%d",&tc)
#define sn sf ("%d",&n)
#define whilecase while (tc--)
#define eof while (cin >> n)
#define forloop for (pos=1; pos<=tc; pos++)
#define arrayloop (i=0; i<n; i++)
#define cinstr cin >> str
#define getstr getline (cin,str)
#define pcase pf ("Case %d: ",pos)
#define pii pair <int,int>
#define pb push_back
#define in insert
#define llu unsigned long long
#define lld long long
#define U unsigned int
#define endl "\n"

const int MOD = 1000000007;
const int MAX = 1000005;

U bigmod (U b, U p, U m)
{
    U p1,p2;

    if (p == 0)
        return 1;

    if (p & 1)
    {
         p1 = b % m;
         p2 = bigmod (b,p-1,m) % m;
         return (p1 * p2) % m;
    }
    else
    {
        p1 = bigmod (b,p/2,m) % m;
        return (p1 * p1) % m;
    }
}

int main (void)
{
    /*
    freopen ("input.txt","r",stdin);
    freopen ("output.txt","w",stdout);
    */
    U tc,pos;
    llu y,z;
    double a,b,x;

    sf ("%u",&tc);

    for (pos=1; pos<=tc; pos++)
    {
        sf ("%lf %lf",&a,&b);

        x = b*log10(a) - floor(b*log10(a));
        y = pow (10,x) * 100;
        z = bigmod (a,b,1000);

        pf ("Case %u: %llu %03llu\n",pos,y,z);
    }

    return 0;
}

Discussion

Friday, September 29, 2017

UVa 10791 - Minimum Sum LCM

প্রবলেম লিঙ্ক : https://goo.gl/9xPtfS

তোমাকে একটি সংখ্যা N দেওয়া থাকবে। কমপক্ষে এমন দুইটি সংখ্যার যোগফল বের করতে হবে যাদের ল.সা.গু হবে N এবং যোগফলটি হবে সর্বনিম্ন। ল.সা.গু বের করার একটি পদ্ধতি হতে পারে Prime Factorization. আমরা এখানে N-এর Prime Factorization করতে পারি। প্রতিটি প্রাইমের জন্য তাদের সর্বোচ্চ পাওয়ারের যোগফলই হবে আমাদের কাঙ্ক্ষিত আউটপুট। কিন্তু আমাদের আবার ক্রিটিকাল কেইস নিয়েও ভাবতে হবে। যদি N-এর মান 1 হয়, কিংবা N একটি প্রাইম হয় কিংবা N-এর মাত্র একটিই প্রাইম ফ্যাক্টর থাকে, তবে আউটপুট হবে N+1.

আমরা এবার কিছু উদাহরণ দেখি। 😀

N যখন 1 : 1 = 1 * 1; এক্ষেত্রে আমরা 1+1 = 2-ই পাবো। কারণ, এই এক জোড়া 1 বাদে 1-এর আর কোন একাধিক সংখ্যার ল.সা.গু হওয়া সম্ভব না।

N যখন প্রাইম : 2 = 1 * 2, 3 = 1 * 3, 5 = 1 * 5; এক্ষেত্রেও আমরা N+1-ই পাবো। কারণ, 1 আর N বাদে N-এর আর কোন একাধিক সংখ্যার ল.সা.গু হওয়া সম্ভব না।

N-এর প্রাইম ফ্যাক্টর যখন মাত্র একটিই : 4 = 2 * 2, 27 = 3 * 3 * 3, 64 = 2 * 2 * 2 * 2 * 2 * 2, 81 = 3 * 3 * 3 * 3; এসব ক্ষেত্রেও N-এর 1 আর N বাদে N-এর আর কোন একাধিক সংখ্যার ল.সা.গু হওয়া সম্ভব না। কারণ, এক্ষেত্রে প্রাইমই আছে একটি। আমরা যদি ওই প্রাইমটির সর্বোচ্চ পাওয়ার বের করি তবে সেটা শেষমেশ N-ই হবে। 😛 কিন্তু আমার তো শুধু N দিয়েই কাজ হচ্ছে না, কারণ মিনিমাম দুইটা সংখ্যা লাগবে।  আমরা জানি, 1 আর N-এর ল.সা.গু সবসময়ই N. তাই আমরা এখানেও চোখ বন্ধ করে বলে দিতে পারি, আউটপুট হবে N+1.

যখন N একটি নিরীহ শান্তশিষ্ট সংখ্যা  : আমরা এইসব কেইসের জন্য N-এর Prime Factorization করব। তারপর N-এর প্রাইম ফ্যাক্টরগুলোর পাওয়ার নিয়ে যোগ করতে থাকব এবং যোগফলটাই হলো আউটপুট। এখানে সর্বোচ্চ পাওয়ারের কথা কেন বলা হলো এবার আমরা নিচের উদাহরণের মাধ্যমে দেখি। 😊

ধরা যাক, আমাকে 4, 6 আর 12-এর ল.সা.গু বের করতে হবে। আমরা প্রতিটাকে Prime Factorize করি। 

4 = 2^2
6 = 2 * 3
12 = 2^2 * 3

দেখা যাচ্ছে, এখানে প্রাইম ফ্যাক্টরগুলো হলো, 2 আর 3; 2-এর সর্বোচ্চ পাওয়ার হলো 2 আর 3-এর সর্বোচ্চ পাওয়ার হলো 1. তাহলে আমরা ল.সা.গু পাই, 2^2 * 3^12 আর পাওয়ারগুলো যোগ করে পাই, 2^2 + 3 = 7.

এখন 7-ই যে আমাদের সর্বনিম্ন যোগফল তা বুঝতে আমরা আরেকটু সামনে এগোই।

12 এর ফ্যাক্টরগুলো হচ্ছে -> 1, 2, 3, 4, 6, 12.
আবার, 12 = 1 * 12 = 2 * 6 = 3 * 4.

সর্বনিম্ন যোগফলের জন্য আমার এখানে দুইটা সংখ্যা  নিলেই হচ্ছে। এর বেশি নিলে সর্বনিম্ন যোগফল পাওয়া যাবে না।
দুইটি সংখ্যার জন্য, আমরা পাই, 12 = 1 * 12 = 3 * 4
এখানে, 1+12 > 4+3  
বা, 13 > 7.
সুতরাং, 12 এর জন্য আউটপুট হবে 7. 😊

এই ছিল UVa 10791 - Minimum Sum LCM এর সল্যুশন হিন্ট। বুঝতে সমস্যা হলে কমেন্ট করতে ভুল করো না। 😊

Problem Solving Helpline

  • UVa 10791 - Minimum Sum LCM

UVa Solutions

Full collection : https://goo.gl/c3ihYp

List :
  1. 10791 - Minimum Sum LCM
  2. 10780 - Again Prime? No Time.
  3. 10139 - Factovisors
  4. 10653 - Bombs! NO they are Mines!!
  5. 10311 - Goldbach and Euler
  6. 439 - Knight Moves
  7. 10299 - Relatives
  8. 10179 - Irreducable Basic Fractions
  9. 11029 - Leading and Trailing
  10. 374 - Big Mod
  11. 1230 - MODEX
  12. 100 - The 3n + 1 problem
  13. 324 - Factorial Frequencies
  14. 371 - Ackermann Functions
  15. 444 - Encoder and Decoder
  16. 483 - Word Scramble
  17. 495 - Fibonacci Freeze
  18. 543 - Goldbach's Conjecture
  19. 568 - Just the Facts
  20. 575 - Skew Binary
  21. 583 - Prime Factors
  22. 623 - 500!
  23. 686 - Goldbach's Conjecture (II)
  24. 884 - Factorial Factors
  25. 591 - Box of Bricks
  26. 10019 - Funny Encryption Method
  27. 484 - The Department of Redundancy Department
  28. 10282 - Babelfish
  29. 10295 - Hay Points
  30. 10226 - Hardwood Species
  31. 11917 - Do Your Own Homework
  32. 10042 - Smith Numbers
  33. 10006 - Carmichael Numbers
  34. 11287 - Pseudoprime Numbers
  35. 10392 - Factoring Large Numbers
  36. 567 - Risk
  37. 417 - Word Index
  38. 10815 - Andy's First Dictionary
  39. 914 - Jumping Champion
  40. 494 - Kindergarten Counting Game
  41. 10323 - Factorial! You Must be Kidding!!!
  42. 10035 - Primary Arithmetic
  43. 10137 - The Trip
  44. 10281 - Average Speed
  45. 12527 - Different Digits (II)
  46. 272 - TEX Quotes
  47. 10970 - Big Chocolate
  48. 10018 - Reverse and Add

10791 - Minimum Sum LCM

/***

            Bismillahir Rahmanir Rahim
            Read the name of Allah, who created you!!!
            Author : Shah Newaj Rabbi Shishir
            Department of CSE, City University, Bangladesh.

***/

#include <bits/stdc++.h>
using namespace std;

#define sf scanf
#define pf printf
#define fast ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define scase sf ("%d",&tc)
#define sn sf ("%d",&n)
#define whilecase while (tc--)
#define eof while (cin >> n)
#define forloop for (pos=1; pos<=tc; pos++)
#define arrayloop (i=0; i<n; i++)
#define cinstr cin >> str
#define getstr getline (cin,str)
#define pcase pf ("Case %d: ",pos)
#define pii pair <int,int>
#define pb push_back
#define in insert
#define llu unsigned long long
#define lld long long
#define U unsigned int
#define endl "\n"

const int MAX = 1000005;
bool prime[MAX];
vector <int> v;

void sieve ()
{
    int i,j;

    v.pb (2);
    prime[0] = prime[1] = true;

    for (i=4; i<MAX; i+=2)
        prime[i] = true;

    for (i=3; i*i<=MAX; i+=2)
        if (!prime[i])
            for (j=i*i; j<MAX; j+=2*i)
                prime[j] = true;

    for (i=3; i<MAX; i+=2)
        if (!prime[i])
            v.pb (i);
}

bool isPrime (lld n)
{
    if (n < 2 || (!(n & 1) && n != 2))
        return false;

    if (n == 2)
        return true;

    for (lld i=2; i*i<=n; i++)
        if (n % i == 0)
            return false;

    return true;
}

lld power (lld n,lld p)
{
    string str;

    while (p)
    {
        if (p & 1)
            str.pb('1');
        else
            str.pb('0');

        p >>= 1;
    }

    reverse (str.begin(),str.end());

    lld i,res = 1,L = str.size();

    for (i=0; i<L; i++)
    {
        res *= res;

        if (str[i] == '1')
            res *= n;
    }

    return res;
}

lld sdiv (lld n)
{
    sieve ();

    lld i,sum = 0,temp = n;
    set <int> myset;

    for (i=0; v[i]*v[i]<=n; i++)
    {
        if (n % v[i] == 0)
        {
            int k = 0;
            myset.in(v[i]);

            while (n % v[i] == 0)
            {
                ++k;
                n /= v[i];
            }

            sum += power(v[i],k);
        }
    }

    if (n > 1)
    {
        myset.in(n);
        sum += n;
    }

    if (myset.size() == 1)
        return temp+1;
    else
        return sum;
}

int main (void)
{
    /*
    freopen ("input.txt","r",stdin);
    freopen ("output.txt","w",stdout);
    */
    lld pos = 0,n;

    while (sf ("%lld",&n) != EOF && n)
    {
        pf ("Case %lld: ",++pos);

        if (n == 1 || isPrime(n))
            pf ("%lld\n",++n);
        else
            pf ("%lld\n",sdiv(n));
    }

    return 0;
}

Thursday, September 28, 2017

1067 - Combinations

/***

            Bismillahir Rahmanir Rahim
            Read the name of Allah, who created you!!!
            Author : Shah Newaj Rabbi Shishir
            Department of CSE, City University, Bangladesh.

***/

#include <bits/stdc++.h>
using namespace std;

#define sf scanf
#define pf printf
#define fast ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define scase sf ("%d",&tc)
#define sn sf ("%d",&n)
#define whilecase while (tc--)
#define eof while (cin >> n)
#define forloop for (pos=1; pos<=tc; pos++)
#define arrayloop (i=0; i<n; i++)
#define cinstr cin >> str
#define getstr getline (cin,str)
#define pcase pf ("Case %d: ",pos)
#define pii pair <int,int>
#define pb push_back
#define in insert
#define llu unsigned long long
#define lld long long
#define U unsigned int
#define endl "\n"

const llu MOD = 1000003;
llu fact[1000001];

llu bigmod (llu b,llu p,llu m)
{
    llu A,B;

    if (p == 0)
        return 1;

    if (p & 1)
    {
        A = b % m;
        B = bigmod (b,p-1,m) % m;
        return (A*B) % m;
    }
    else
    {
        A = bigmod (b,p/2,m) % m;
        return (A*A) % m;
    }
}

int main (void)
{
    /*
    freopen ("input.txt","r",stdin);
    freopen ("output.txt","w",stdout);
    */

    llu tc,pos,n,k,i,u,d,res;

    fact[0] = 1;

    for (i=1; i<1000001; i++)
        fact[i] = ((fact[i-1] % MOD) * (i % MOD)) % MOD;

    sf ("%llu",&tc);

    for (pos=1; pos<=tc; pos++)
    {
        sf ("%llu %llu",&n,&k);

        u = fact[n];
        d = ((fact[k] % MOD)*(fact[n-k] % MOD)) % MOD;
        res = bigmod (d,MOD-2,MOD);
        res = ((u % MOD) * (res % MOD)) % MOD;

        pf ("Case %llu: %llu\n",pos,res);
    }

    return 0;
}

Tuesday, September 19, 2017

LightOJ Solutions

Full collection : https://goo.gl/FQVrz6

List :
  1. 1305 - Area of a Parallelogram
  2. 1354 - IP Checking
  3. 1227 - Boiled Eggs
  4. 1249 - Chocolate Thief
  5. 1225 - Palindromic Numbers (II)
  6. 1107 - How Cow
  7. 1212 - Double Ended Queue
  8. 1116 - Ekka Dokka
  9. 1214 - Large Division
  10. 1113 - Discover the Web
  11. 1182 - Parity
  12. 1387 - Setu
  13. 1069 - Lift
  14. 1053 - Higher Math
  15. 1022 - Circle in Square
  16. 1015 - Brush (I)
  17. 1001 - Opposite Task
  18. 1000 - Greetings from LightOJ
  19. 1136 - Division by 3
  20. 1035 - Intelligent Factorial Factorization
  21. 1338 - Hidden Secret!
  22. 1133 - Array Simulation
  23. 1294 - Positive Negative Sign
  24. 1197 - Help Hanzo
  25. 1007 - Mathematically Hard
  26. 1014 - Ifter Party
  27. 1045 - Digits of Factorial
  28. 1215 - Finding LCM
  29. 1078 - Integer Divisibility
  30. 1028 - Trailing Zeroes (I)
  31. 1090 - Trailing Zeroes (II)
  32. 1259 - Goldbach's Conjecture
  33. 1067 - Combinations
  34. 1282 - Leading and Trailing

Codeforces Solutions

BDOI16B - Beautiful Factorial Game

/***

            Bismillahir Rahmanir Rahim
            Read the name of Allah, who created you!!!
            Author : Shah Newaj Rabbi Shishir
            Department of CSE, City University, Bangladesh.

***/

#include <bits/stdc++.h>
using namespace std;

#define sf scanf
#define pf printf
#define fast ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define scase sf ("%d",&tc)
#define sn sf ("%d",&n)
#define whilecase while (tc--)
#define eof while (cin >> n)
#define forloop for (pos=1; pos<=tc; pos++)
#define arrayloop (i=0; i<n; i++)
#define cinstr cin >> str
#define getstr getline (cin,str)
#define pcase pf ("Case %d: ",pos)
#define pii pair <int,int>
#define pb push_back
#define in insert
#define llu unsigned long long
#define lld long long
#define U unsigned int
#define endl "\n"

const int MOD = 1000000007;
const int MAX = 10005;
bool prime[MAX];
vector <int> v;

void sieve ()
{
    int i,j;

    v.pb(2);
    prime[0] = prime[1] = true;

    for (i=4; i<MAX; i+=2)
        prime[i] = true;

    for (i=3; i*i<=MAX; i+=2)
        if (!prime[i])
            for (j=i*i; j<MAX; j+=2*i)
                prime[j] = true;

    for (i=3; i<MAX; i+=2)
        if (!prime[i])
            v.pb(i);
}

int fun (int n, int p, int f)
{
    int sum = 0;

    while (n != 0)
    {
        n /= p;
        sum += n;
    }

    sum /= f;

    return sum;
}

int main (void)
{
    /*
    freopen ("input.txt","r",stdin);
    freopen ("output.txt","w",stdout);
    fast;
    */
    sieve ();

    int tc,pos,m,n,t,l,i,j,val,mini;

    cin >> tc;

    for (pos=1; pos<=tc; pos++)
    {
        cin >> n >> m;

        cout << "Case " << pos << ": ";

        vector <int> P,F;
        t = m;

        int len = v.size();

        for (i=0; i<len; i++)
        {
            if (t % v[i] == 0)
            {
                P.pb(v[i]);
                j = 0;

                while (t % v[i] == 0)
                {
                    t /= v[i];
                    j++;
                }

                F.pb(j);
            }
        }

        if (t > 1)
        {
            P.pb(t);
            F.pb(1);
        }

        l = P.size(), mini = 1e9, val = 0;

        for (i=0; i<l; i++)
        {
            val = fun (n,P[i],F[i]);

            mini = min (val,mini);
        }

        cout << mini << endl;
    }

    return 0;
}

Sunday, September 17, 2017

ফ্যাক্টোরিয়ালের ভেতরের পোকা

তোমাদের সেই ছোট্ট ছেলে পিনোকিওর কথা মনে আছে ??? যে কিনা একটি গ্রামে বাস করত আর মিথ্যে কথা বললেই যার নাক হয়ে যেত ইয়া লম্বা!

তো সেই পিনোকিও একদিন দুপুরবেলা ঘুরতে বেরোলো, কোথায় যাবে তার ঠিক নেই। মা নিষেধ করলেন বের হতে। কিন্তু পিনোকিও ঘুরতে যাবেই। তো যেতে যেতে সে অনেকদূর চলে এসেছে। সামনে পড়ল এক ঝর্ণা। এদিকে হাঁটতে হাঁটতে পিনোকিও বেশ ক্লান্ত। ঝর্ণার মিষ্টি পানি খেয়ে যেইনা একটু জিরোনোর জন্য বসেছে, অমনি যেন কোথা থেকে চার শিংয়ের এক গুঁফোদৈত্য এসে হাজির। দৈত্য বললো, এই ঝর্ণার পানি সে কাউকে ছুঁতেও দেয় না। কিন্তু আজ দুপুরে সে উদরপূর্তি করে ভাতঘুম দিতে গিয়েছিল। তাই পিনোকিও কোন দিক থেকে এসে পানি খেয়ে নিয়েছে সেটা সে বুঝতেই পারেনি। এখন ঘুম ভেঙ্গে দৈত্য তো বেজায় রাগ করে বসে আছে। আর পিনোকিওকে একটা শাস্তি দেওয়ার প্ল্যান করছে মনে মনে। বেচারা পিনোকিও ভাবছে, " ইশশ, কেনো যে মায়ের কথা অমান্য করে এখানে এলাম??? 😭"

গুঁফো বললো, সে গণিত খুউব্বই ভালোবাসে। তাকে একটা সংখ্যা দেওয়া হলে, সে চটপট ওইটার ফ্যাক্টোরিয়াল বের করে দিতে পারে। কিন্তু সংখ্যাটা আবার 20 এর বেশি হতে পারবে না! 😛

কিন্তু সে কয়েকদিন ধরে একটা সমস্যা সমাধান করতে চেষ্টা করছে। সে একটি সংখ্যার ফ্যাক্টোরিয়ালে অন্য আরেকটি সংখ্যা ঠিক কতবার আছে সেটা বের করতে চাচ্ছে। গুঁফোদৈত্য অনেক চেষ্টা করেও তার কোন সমাধানে আসতে পারছে না। তো পিনোকিওকে সেটা্র সমাধান দিতে হবে।

যারা "ঠিক কতবার আছে" এই কথাটা বুঝতে পারোনি, তারা একটা বিষয় লক্ষ্য করো, দৈত্য আসলে প্রথম সংখ্যার ফ্যাক্টোরিয়ালে দ্বিতীয় সংখ্যা কতবার আছে সেটা বের করতে চেয়ে আসলে তার সর্বোচ্চ পাওয়ার কত সেটাই বের করতে বলেছে। 

পিনোকিও এটা শুনে তো খুব ভয় পেয়ে গেলো। কারণ দৈত্যের সমাধান করতে হলে তো এখন তাকে ফ্যাক্টোরিয়াল বের করে দিতে হবে, তারপর তাকে গুণে গুণে হিসাব করতে হবে ওই পিচ্চি সংখ্যাটা ঠিক কতবার আছে ফ্যাক্টোরিয়ালের ভেতর! 😩

সে আসলো তোমার কাছে। কারণ তুমি আবার কনটেস্ট-ফনটেস্ট না কি একটা করো। তাই তোমার কাছে এসব তো ডালভাত। তুমিও মহানন্দে লেগে গেলা পিনোকিওকে সাহায্য করতে, নাহলে দৈত্য যে তাকে ছাড়বে না বাপু।

পিনোকিও একটা সংখ্যার প্রাইম ফ্যাক্টরগুলো বের করতে জানে। সে জানে যেকোন সংখ্যাকেই কতগুলি প্রাইম নাম্বারের পাওয়ারের গুণফল আকারে লিখা যায়। যেমন, আমরা চাচ্ছি, ১০কে প্রাইম ণাম্বারে ভাঙ্গাবো, আমরা তখন লিখব,
10 = 2^1 * 5^1
একইভাবে, 20 = 2^2 * 5^1
100 = 2^2 * 5^2

তো দেখা যাচ্ছে, আমরা একটি সংখ্যার প্রাইম ফ্যাক্টোরাইজেশন করতে হলে প্রথমে 2 থেকে শুরু করবো, যতক্ষণ 2 দ্বারা ভাগ করা যাচ্ছে ভাগ করতেই থাকব। একটা সময় আর 2 দ্বারা ভাগ করা না গেলে, তখন আমরা দেখবো সেটাকে 3 দ্বারা ভাগ করা যায় কিনা। তারপর 5, 7, 11, 13, 17, 19 ইত্যাদি ইত্যাদি।

এখন কথা হলো, ফ্যাক্টোরিয়ালে আরেকটা সংখ্যা কতবার থাকবে তার সাথে আবার এই প্রাইম ফ্যাক্টোরাইজেশনের সম্পর্ক কী? আছে, বলছি। 😋

আপাতত আমরা গুঁফোর সমস্যায় ফিরে যাই। খুব আশ্চর্যজনক হলেও সত্য যে, এই পাওয়ার বের করতে হলে আমাদের কোন ফ্যাক্টোরিয়ালই বের করা লাগবে না। আমাদের গুঁফোদৈত্যের সমাধান দিতে হলে আগে যে ব্যাপারটা মাথায় রাখা লাগবে তা হলো, যে সংখ্যাটি ফ্যাক্টোরিয়ালে কতবার আছে তা বের করতে বলা হয়েছে সেটি কি প্রাইম নাকি কম্পোজিট।

যদি প্রাইম হয়
সেটা আমরা খুব সহজেই বের করতে পারবো ফরাসী গণিতবিদ Legendre'র একটি চমৎকার সূত্র দিয়ে। তাঁর সূত্রমতে, একটি সংখ্যা n এর ফ্যাক্টোরিয়ালে আরেকটি প্রাইম p এর সর্বোচ্চ পাওয়ার কত হবে, সেটা বের করতে হলে আমরা শূন্য না হওয়া পর্যন্ত n-কে p দিয়ে ভাগ করতেই থাকব, করতেই থাকব। আর প্রতিবার ভাগফলগুলোর পূর্ণসাংখ্যিক মান নিয়ে যোগ করতে থাকব। এভাবে ভাগ করতে থাকলে এক সময় আমাদের n-এর মান শূন্য হবে, এভাবে যোগফলটাই হবে আমাদের সর্বোচ্চ পাওয়ার, hurrah !! 😄
একটা ছোট্ট উদাহরণ দিয়ে ব্যাখ্যা করা যাক।

ধরো, আমরা ১০ এর ফ্যাক্টোরিয়ালে ২ কতবার আছে সেটা বের করব। এখন আমরা এর ধাপগুলো দেখি।

ধাপ 1 : 10/2 = 5.0; আমরা নিবো 5. যোগফল = 5.
ধাপ 2 : 5/2 = 2.5; আমরা নিবো 2. যোগফল = 5+2 = 7.
ধাপ 3 : 2/2 = 1.0; আমরা নিবো 1. যোগফল = 7+1 = 8.
ধাপ 4 : 1/2 = 0.5; এখানে আমাদের থামতে হবে কারণ ভাজ্য 1, 2 এর চেয়ে ছোট, তাই ভাগফলের পূর্ণসাংখ্যিক মান হবে 0।

তো আমরা পেলাম, 10! এ 2 আছে 8 বার। গাণিতিকভাবে, 10! = 3628800 আর 2^8 = 256. আমরা 10! কে 2^8 দ্বারা ভাগ করলে 14175 পাবো, যেটাকে আর 2 দ্বারা ভাগ করা যাচ্ছে না।

যদি কম্পোজিট হয়
এটা বের করাও খুব একটা কঠিন না। আমরা প্রথমে প্রাইম ফ্যাক্টোরাইজেশন দেখেছি, এক্ষেত্রে আমরা নিচের ধাপগুলো অনুসরণ করব।

ধাপ 1 : যে সংখ্যাটার পাওয়ার বের করতে বলবে সেই সংখ্যাটাকে আগে প্রাইম ফ্যাক্টরাইজ করবো। ধরে নেই, আমাকে 100! এর ভেতর 18 কতবার আছে সেটা বের করতে বলা হয়েছে। তো আগে আমরা 18 এর প্রাইম ফ্যাক্টোরাইজেশন করব এভাবে, 18 = 2 * 3^2.
ধাপ 2 : এবার প্রতিটি প্রাইম ফ্যাক্টর দিয়ে প্রথম সংখ্যাটাকে আগের সূত্রের মতোই ভাগ করতে থাকব। এভাবে ভাগ করলে আমরা 2 এর জন্য পাওয়ার পাবো 97 এবং 3 এর জন্য পাওয়ার পাবো 48.
ধাপ 3 : এবার প্রতি প্রাইমের পাওয়ারকে ওই প্রাইমের ফ্রিকোয়েন্সি দিয়ে ভাগ করবো। লক্ষ্য করলে দেখা যাবে যে, 18 এর প্রাইম ফ্যাক্টোরাইজেশনে 2 আছে 1 বার, তাই 2 এর ফ্রিকোয়েন্সি 1. একইভাবে 3 এর ফ্রিকোয়েন্সি হচ্ছে 2. আমরা ভাগ করলে 2 এর জন্য পাবো, 97/1 = 97 এবং 3 এর জন্য পাবো 48/2 = 24.
ধাপ 4 : সবশেষে আমরা সবগুলো ভাগফলের সর্বনিম্ন মানটা নিব। 97 এবং 24 এর মধ্যে সর্বনিম্ন হচ্ছে 24. সুতরাং, আমাদের সর্বোচ্চ পাওয়ার হবে 24.

আর এভাবেই পিনোকিও গুঁফোদৈত্যের সমস্যার সমাধান করে ফেলেছিলো। এখন সে তোমার কাছে আরেকটি আবদার নিয়ে এসেছে যে তাকে কিছু প্রোগ্রামিং সমস্যা দিতে হবে যেগুলো করে সে বেশ ভালভাবেই ব্যাপারটা আয়ত্ত্বে আনতে পারবে। গুঁফোদৈত্য তো 20 এর বেশি ফ্যাক্টোরিয়াল চিন্তা করতেই পারতো না, এখন পিনোকিও 20 এর চেয়ে অনেক বড় সংখ্যার ফ্যাক্টোরিয়ালের জন্যও এই হিসাব-নিকাশ করতে পারবে। আর সে এটাও বুঝতে পেরেছে যে, কখনো বড়দের কথার অবাধ্য হতে হয়না। 😊

রিলেটেড প্রবলেম :
রেফারেন্স লিংক :

হ্যাপী কোডিং। 😂
হ্যাপী নাম্বার থিওরিং! 😉

10780 - Again Prime? No Time.

/***

            Bismillahir Rahmanir Rahim
            Read the name of Allah, who created you!!!
            Author : Shah Newaj Rabbi Shishir
            Department of CSE, City University, Bangladesh.

***/

#include <bits/stdc++.h>
using namespace std;

#define sf scanf
#define pf printf
#define fast ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define scase sf ("%d",&tc)
#define sn sf ("%d",&n)
#define whilecase while (tc--)
#define eof while (cin >> n)
#define forloop for (pos=1; pos<=tc; pos++)
#define arrayloop (i=0; i<n; i++)
#define cinstr cin >> str
#define getstr getline (cin,str)
#define pcase pf ("Case %d: ",pos)
#define pii pair <int,int>
#define pb push_back
#define in insert
#define llu unsigned long long
#define lld long long
#define U unsigned int
#define endl "\n"

const int MOD = 1000000007;
const int MAX = 10005;
bool prime[MAX];
vector <int> v;

void sieve ()
{
    int i,j;

    v.pb(2);
    prime[0] = prime[1] = true;

    for (i=4; i<MAX; i+=2)
        prime[i] = true;

    for (i=3; i*i<=MAX; i+=2)
        if (!prime[i])
            for (j=i*i; j<MAX; j+=2*i)
                prime[j] = true;

    for (i=3; i<MAX; i+=2)
        if (!prime[i])
            v.pb(i);
}

int fun (int n, int p, int f)
{
    int sum = 0;

    if (p > n)
        return -1;

    while (n != 0)
    {
        n /= p;
        sum += n;
    }

    sum /= f;

    return sum;
}

int main (void)
{
    /*
    freopen ("input.txt","r",stdin);
    freopen ("output.txt","w",stdout);
    */
    fast;
    sieve ();

    int tc,pos,m,n,t,l,i,j,val,mini;

    cin >> tc;

    for (pos=1; pos<=tc; pos++)
    {
        cin >> m >> n;

        cout << "Case " << pos << ":\n";

        vector <int> P,F;
        t = m;

        for (i=0; v[i]*v[i]<=t; i++)
        {
            if (t % v[i] == 0)
            {
                P.pb(v[i]);
                j = 0;

                while (t % v[i] == 0)
                {
                    t /= v[i];
                    j++;
                }

                F.pb(j);
            }
        }

        if (t > 1)
        {
            P.pb(t);
            F.pb(1);
        }

        l = P.size(), mini = INT_MAX, val = 0;
        bool u = true;

        for (i=0; i<l; i++)
        {
            val = fun (n,P[i],F[i]);

            if (val == -1)
            {
                cout << "Impossible to divide" << endl;
                u = false;
                break;
            }

            mini = min (val,mini);
        }

        if (u)
            cout << mini << endl;
    }

    return 0;
}