Showing posts with label ডেটা স্ট্রাকচার. Show all posts
Showing posts with label ডেটা স্ট্রাকচার. Show all posts

সমাবেশ (Combination) Calculation nCr

Standard
/**Bismillahir Rahmanir Rahim.**/

#include <bits/stdc++.h>

using namespace std;

long long ara[52][52];
long long nCr(int n, int r)
{
    if(n == r) return 1;
    if(r == 1) return n;
    if(ara[n][r]!=0) return ara[n][r];
    return ara[n][r] = nCr(n-1, r) + nCr(n-1, r-1);
}
int main()
{
    int n = 50, r = 25;
    long long ans = nCr(n, r);
    cout << ans << endl;
    return 0;
}

ফেক্টরিয়ালের পেছনের ০ (Trailing Zeros on Factorial)

Standard
/**Bismillahir Rahmanir Rahim.**/

#include <bits/stdc++.h>

using namespace std;

int zero(int x)
{
    int ans = 0;
    for(int i=5; x/i>0;i*=5)
        ans += x/i;
    return ans;
}
int main()
{
    int n;
    cin >> n ;
    cout << zero(n) << endl;
    return 0;
}

int main()
{
    int ans = bigMod(4, 100001, 1234);
    cout << ans << endl;
    return 0;
}

বিগমড (Bigmod)

Standard
/**Bismillahir Rahmanir Rahim.**/

#include <bits/stdc++.h>

using namespace std;

int bigMod(int a, int n, int m)
{
    //here, a, n and m refer to (a^n)%m

    if(n==0) return 1 % m ;
    int x = bigMod(a, n/2, m);
    x = (x*x) % m;
    if(n%2) x = (x*a)%m;
    return x%m;
}
int main()
{
    int ans = bigMod(4, 100001, 1234);
    cout << ans << endl;
    return 0;
}

অয়লার এর টোশেন্ট ফাংশন (Euler's Totient Function) {শুধুমাত্র একটি সংখ্যা n এর জন্য}

Standard
n এর থেকে ছাট বা সমান এমন কতগুলি সংখ্যা  আছে যা n এর সাথে coprime।   coprime অর্থ হল তাদের ১ ছাড়া কোন সাধারণ গুণনীয়ক নেই।
/**Bismillahir Rahmanir Rahim.**/

#include <bits/stdc++.h>

using namespace std;

int Phi(int n)
{
    int ans = n;
    for(int i=2; i*i<=n; i++)
    {
        if(n%i==0)
        {
            while(n%i==0)
                n/=i;
            ans -= ans/i;
        }
    }
    if(n>1) ans -= ans/n;
    return ans;
}
int main()
{
    int n;
    scanf("%d", &n);
    int ans = Phi(n);
    printf("Number of Coprime for %d is %d\n", n, ans);
    return 0;
}

ল.সা.গু (LCM) (দুই এবং দুইয়ের অধিক সংখ্যার জন্য)

Standard
দুইটি সংখ্যার জন্য ল.সা.গুঃ

/**Bismillahir Rahmanir Rahim.**/

#include <bits/stdc++.h>

using namespace std;

int GCD(int a, int b)
{
    if(b==0) return a;
    return GCD(b, a%b);
}
int LCM(int a, int b)
{
    int gcd = GCD(a, b);
    return (a/gcd)*b;
}
int main()
{
    int a, b, ans;
    cin >> a >> b;
    ans = LCM(a,b);
    cout << ans << endl;
    return 0;
}
 
দুইটির বেশী সংখ্যার জন্য ল.সা.গুঃ

/**Bismillahir Rahmanir Rahim.**/

#include <bits/stdc++.h>

using namespace std;

int GCD(int a, int b)
{
    if(b==0) return a;
    return GCD(b, a%b);
}
int LCM(int a, int b)
{
    int gcd = GCD(a, b);
    return (a/gcd)*b;
}
int main()
{
    int ans, n;
    cin >> n;
    int ara[n];
    for(int i=0; i<n; i++)
        cin >> ara[i];
    ans = ara[0];
    for(int i=1; i<n; i++)
        ans = LCM(ans, ara[i]);
    cout << ans << endl;
    return 0;
}

গ.সা.গু (GCD) (দুই এবং দুইয়ের অধিক সংখ্যার জন্য)

Standard
দুইটি সংখ্যার জন্য গ.সা.গুঃ

/**Bismillahir Rahmanir Rahim.**/

#include <bits/stdc++.h>

using namespace std;

int GCD(int a, int b)
{
    if(b==0) return a;
    return GCD(b, a%b);
}
int main()
{
    int a, b, ans;
    cin >> a >> b;
    ans = GCD(a,b);
    cout << ans << endl;
    return 0;
}

দুইটির বেশী সংখ্যার জন্য গ.সা.গুঃ

/**Bismillahir Rahmanir Rahim.**/

#include <bits/stdc++.h>

using namespace std;

int GCD(int a, int b)
{
    if(b==0) return a;
    return GCD(b, a%b);
}
int main()
{
    int ans, n;
    cin >> n;
    int ara[n];
    for(int i=0; i<n; i++)
        cin >> ara[i];
    ans = ara[0];
    for(int i=1; i<n; i++)
        ans = GCD(ans, ara[i]);
    cout << ans << endl;
    return 0;
}

Sum of Divisor (SOD) using 2 Method

Standard
একটি সংখ্যা n দেওয়া আছে। এর বিভাজকের যোগফল বের করতে হবে।

Method 1: রোট পর্যন্ত লোপ চালিয়ে।

/**Bismillahir Rahmanir Rahim.**/

#include <bits/stdc++.h>

using namespace std;


int SOD(int n)
{
    int limit = sqrt(n+1);
    int res = 0;
    for(int i=1; i<=limit; i++)
        if(!(n%i))
        {
            res += i;
            res += (n/i);
        }
    if(limit*limit==n) res -= limit;
    return res;
}
int main()
{
    int ans, n;
    scanf("%d", &n);
    ans = SOD(n);
    printf("%d\n", ans);
    return 0;
}
Method 2: প্রাইম ফ্যাক্টরাইজড করে।

/**Bismillahir Rahmanir Rahim.**/

#include <bits/stdc++.h>

using namespace std;

int prime[4009], x=1;

void seivePrime()
{
    char prime_b[10000];
    memset(prime_b, 0, sizeof(prime_b));
    int till = 10000;
    for(int i=4; i<=till; i+=2)
        prime_b[i] = 1;
    int limit = sqrt(till)+1;
    for(int i=3; i<=limit; i+=2)
        if(!prime_b[i])
            for(int j=i*i; j<=till; j+=(i*2))
                prime_b[j] = 1;
    prime[0] = 2;
    for(int i=3; i<=till; i+=2)
        if(!prime_b[i])
            prime[x++] = i;
}
int SOD(int n)
{
    int till = sqrt(n+1), res=1;
    for(int i=0; prime[i]<=till; i++)
    {
        if(n%prime[i]==0)
        {
            int tmpSum = 1, p = 1;
            while(n%prime[i]==0)
            {
                n/=prime[i];
                p *= prime[i];
                tmpSum += p;
            }
        till = sqrt(n);
        res *= tmpSum;
        }
    }
    if(n>1) res *= (n+1);
    return res;
}
int main()
{
    seivePrime();
    int ans, n;
    scanf("%d", &n);
    ans = SOD(n);
    printf("%d\n", ans);
    return 0;
}

Number of Divisor (NOD) using 2 Method

Standard
একটি সংখ্যা n দেওয়া আছে। এর কয়টি বিভাজক আছে বের করতে হবে।

Method 1: রোট পর্যন্ত লোপ চালিয়ে।

/**Bismillahir Rahmanir Rahim.**/

#include <bits/stdc++.h>

using namespace std;

int NOD(int n)
{
    int limit = sqrt(n+1);
    int res = 0;
    for(int i=1; i<=limit; i++)
        if(!(n%i))
            res += 2;
    if(limit*limit==n) res--;
    return res;
}
int main()
{
    int ans, n;
    scanf("%d", &n);
    ans = NOD(n);
    printf("%d\n", ans);
    return 0;
}
Method 2: প্রাইম ফ্যাক্টরাইজড করে।

/**Bismillahir Rahmanir Rahim.**/

#include <bits/stdc++.h>

using namespace std;

int prime[4009], x=1;

void seivePrime()
{
    char prime_b[10000];
    memset(prime_b, 0, sizeof(prime_b));
    int till = 10000;
    for(int i=4; i<=till; i+=2)
        prime_b[i] = 1;
    int limit = sqrt(till)+1;
    for(int i=3; i<=limit; i+=2)
        if(!prime_b[i])
            for(int j=i*i; j<=till; j+=(i*2))
                prime_b[j] = 1;
    prime[0] = 2;
    for(int i=3; i<=till; i+=2)
        if(!prime_b[i])
            prime[x++] = i;
}

int NOD(int n)
{
    int till = sqrt(n+1);
    int p=0, res = 1;
    for(int i=0; prime[i]<=till; i++)
    {
        if(n%prime[i]==0)
        {
            while(n%prime[i]==0)
            {
                n/=prime[i];
                p++;
            }
        }
        till = sqrt(n);
        res *= (p+1);
        p = 0;
    }
    if(n>1) res *= 2;
    return res;
}
int main()
{
    seivePrime();
    int ans, n;
    scanf("%d", &n);
    ans = NOD(n);
    printf("%d\n", ans);
    return 0;
}

মৌলিক উৎপাদকে বিশ্লেষণ (Prime Factorization)

Standard
একটি সংখ্যা n দেওয়া আছে। এটিকে মৌলিক উৎপাদকে বিশ্লেষণ করতে হবে।


/**Bismillahir Rahmanir Rahim.**/

#include <bits/stdc++.h>

using namespace std;

int ara[1000], x;

int primeFact(int n)
{
    while(n%2==0)
    {
        n/=2;
        ara[x++] = 2;
    }
    int limit = sqrt(n+1);
    for(int i=3; i<=limit && n>1; i+=2)
        while(n%i==0)
        {
            n/=i;
            ara[x++] = i;
        }
    if(n>2) ara[x++] = n;
    return x;
}
int main()
{
    int n=10000, till;

    till = primeFact(n);

    for(int i=0; i<till; i++)
        printf("%d ", ara[i]);
    return 0;
}

সেগমেন্টেড সীভ (Segmented Sieve)

Standard
দুইটি সংখ্যা A আর B দেওয়া আছে (A<B)। A থেকে B পর্যন্ত প্রাইম নাম্বার গুলো প্রিন্ট করতে হবে। A = 100, B = 1000 এর জন্য নিচের কোড করা হল।


/**Bismillahir Rahmanir Rahim.**/

#include <bits/stdc++.h>

using namespace std;

int prime[100], x, final_prime[100], y;

void seivePrime(char prime_b[], int b)
{
    prime_b[1]=1;
    int till = sqrt(b+1);
    for(int i=4; i<=till; i+=2)
        prime_b[i] = 1;
    int limit = sqrt(till)+1;
    for(int i=3; i<=limit; i+=2)
    {
        if(!prime_b[i])
        {
            for(int j=i*i; j<=till; j+=(i*2))
                prime_b[j] = 1;
        }
    }
    prime[0] = 2;
    for(int i=3; i<=till; i+=2)
        if(!prime_b[i])
            prime[++x] = i;
}

void segment_prime(int A, int B)
{
    if(A==1) A+=1;
    char segment[B-A+1];
    memset(segment, 0, sizeof(segment));
    for(int i=0; i<x; i++)
    {
        int start = prime[i]*prime[i];
        if(start<A) start = ((A+prime[i]-1)/prime[i])*prime[i];
        for(; start<=B; start += prime[i])
            segment[start-A] = 1;
    }
    if(A == 2) final_prime[y++] = 2;
    int j=A+1;
    if(A%2) j=A;
    for(; j<=B; j+=2)
        if(!segment[j-A])
            final_prime[y++] = j;
}
int main()
{
    int a = 100, b = 1000;
    char prime_b[123];
    memset(prime_b, 0, sizeof(prime_b));

    seivePrime(prime_b, b);

    segment_prime(a, b);

    for(int i=0; i<y; i++)
        printf("%d ", final_prime[i]);
    return 0;
}

সীভ মেথডে প্রাইম বের করা (Calculation Prime Number Using Sieve)

Standard
1 থেকে n পর্যন্ত সব প্রাইম নাম্বার বের করতে হবে সীভ মেথডে। নিচের প্রোগ্রামে ১০০০ পর্যন্ত বের করা হল।
Complexity : O(n log log n).

/**Bismillahir Rahmanir Rahim.**/

#include <bits/stdc++.h>

using namespace std;

void seivePrime(char seive[])
{
    seive[1]=1;
    int till=1000;
    for(int i=4; i<=till; i+=2)
        seive[i] = 1;
    int limit = sqrt(till)+1;
    for(int i=3; i<=limit; i+=2)
    {
        if(!seive[i])
            for(int j=i*i; j<=till; j+=(i*2))
                seive[j] = 1;
    }
}

int main()
{
    char seive[1005];
    memset(seive, 0, sizeof(seive));

    seivePrime(seive);

    for(int i=2; i<=1000; i++)
        if(!seive[i])
            printf("%d ", i);
    return 0;
}