৩১ জানুয়ারি ২০১৬

Number of Divisors/factors (DP Approach)


for only Prime Factors 
 
int num[mx7+9];

void nof()
{
    int i,j;

    for(i=4;i<=mx7;i+=2)
    {
        num[i] = 2;
    }

    for(i=3;i*i<=mx7;i+=2)
    {
        if(!num[i])
        {
            for(j=i*i;j<=mx7;j+=i)
            {
                num[j] = i;
            }
        }
    }

    for(i=2;i<=mx7;i++)
    {
        int n = num[i] ? num[i] : i;
        num[i] = 1 + num[i/n];
    }

    for(i=2;i<=21;i++)cp(num[i]);
}

int main()
{
    nof();
} 

২৯ জানুয়ারি ২০১৬

Is n a Perfect Square ?

// Header file begin
#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
#include<string>
#include<vector>
#include<cmath>
#include<cctype>
#include<sstream>
#include<set>
#include<list>
#include<stack>
#include<utility>
#include<queue>
#include<algorithm>
#include<cstdlib>
// End
//..........
// Macro
#define sf scanf
#define pf printf
#define lp1(i,n) for(i=0;i<n;i++)
#define lp2(i,n) for(i=1;i<=n;i++)
#define mem(c,v) memset(c,v,sizeof(c))
#define cp(a) cout<<" "<<a<<" "
#define nl puts("")
#define sq(x) ((x)*(x))
#define all(x) x.begin(),x.end()
#define reall(x) x.rbegin(),x.rend()
#define s_wap(x,y) x^=y;y^=x;x^=y;
#define sz size()
#define gc getchar()
#define pb push_back
#define freader freopen("input.txt","r",stdin)
// End.........

// Size
#define mx7 20000100
#define mx6 1500000
#define mx5 100005
#define mx4 1000100
#define inf 1<<30                                           //infinity value
#define eps 1e-9
#define mx (65540)
#define mod 1000000007
#define pi acos(-1.0)

// Macros for Graph

#define white 1
#define gray 2
#define black 3
#define nil 0

using namespace std;
/***************/

// typedef

typedef long long LL;
typedef long L;
typedef unsigned long long ull;
typedef unsigned long ul;
typedef unsigned int ui;
typedef pair<int, int> pii;
typedef vector<int>vi;
typedef vector<long long> vll;
typedef vector<long>vl;
typedef vector<char>vch;
typedef vector<string>vs;
typedef map<int,int>mpii;
typedef map<int,bool>mpbi;
typedef map<long,bool>mpbl;
typedef map<long long,bool>mpbll;
typedef map<char,int>mpci;
typedef map<char,bool>mpbc;
typedef map<string,int>mpsi;
typedef map<long long,long long>mpll;

// template

template<class T> T gcd(T a, T b ) {return b!=0?gcd<T>(b,a%b):a;}
template<class T> T large(T a, T b ) {return a>b?a:b;}
template<class T> T small(T a, T b ) {return a<b?a:b;}
template<class T> T diffrnce(T a, T b) {return a-b<0?b-a:a-b;}

int prime[(mx>>6)+1],prm[(mx>>1)+9],plen=0,qrt=(int)sqrt(double(mx));

#define setbit(n) (prime[n>>6] |= (1<<((n>>1)&31)))
#define checkbit(n) (prime[n>>6] & (1<<((n>>1)&31)))

void sieve()
{
    int i,j;
    for(i=3;i<=qrt;i+=2)
    {
        if(!checkbit(i))
        {
            for(j=i*i;j<=mx;j+=i+i)
            {
                setbit(j);
            }
        }
    }
    prm[plen++]=2;
    for(i=3;i<=mx;i+=2)
    {
        if(!checkbit(i))
        {
            prm[plen++]=i;
        }
    }
    //lp1(i,100)cp(prm[i]);
}

mpii mp;

void factors(int n)
{
    mp.clear();
    int i,keep=n;
    bool yes1=false,yes2=false;
    for(i=0;i<plen and sq(prm[i])<=n;i++)
    {
        if(!(n%prm[i]))
        {
            while(!(n%prm[i]))
            {
                mp[prm[i]]++;
                n/=prm[i];
                if(n==0 or n==1)break;
            }

            if(!(mp[prm[i]]&1))
            {
                yes1=true;
            }
        }
    }

    if(n>1)
    {
        mp[n]++;
    }
    if(!(mp[n]&1))
    {
        yes2=true;
    }
    if(yes1)
    {
        if(yes2)
        {
            cout<<"Yes: " << keep << " is a perfect square\n";
        }
        else
        {
            cout<<"No: " << keep << " is not a perfect square\n";;
        }
    }
    else
    {
        cout<<"No: " << keep << " is not a perfect square\n";
    }
}

int main()
{
    sieve();
    int n;
    while(cin >> n)
    {
        if(n==1)
        {
            cout<<"Yes: " << n << " is a perfect square\n";
            continue;
        }

        factors(n);
    }

    return 0;
}

০২ জানুয়ারি ২০১৬

Uva 11526 - H(n)

Analysis
According to the given code :: 

 long long H(int n){
long long res = 0;
for( int i = 1; i <= n; i=i+1 ){
res = (res + n/i);
}
return res;
}

We can get for n=20 is ::
20+10+6+5+4+3+2+2+2+2+1+1+1+1+1+1+1+1+1+1
=  20+10+6+5+4+3+8+10
=  20+10+6+5+10+8+4+3
=  20+10+6+5+1*(20-10)+2*(10-6)+3*(6-5)+4*(5-4)
=  20+10+6+5+20-10+20-12+18-15+20-16
=  20+10+6+5+20+10+6+5-16
= (20+10+6+5)+(20+10+6+5)-4*4
= 2(20+10+6+5) - 4*4

again, sqrt(20) = 4;

So, see that ...


৩০ ডিসেম্বর ২০১৫

Big Mod

R = B^P mod M

 LL m;

LL big_mod(LL n, LL p)
{
    if(p==0) return 1;

    if(!(p&1))
    {
        LL r = big_mod(n,p/2) % m;

        return ( (r%m) * (r%m) ) % m;
    }

    else
    {
        return ( ( n%m) * (big_mod(n,p-1) %m)) % m;
    }
}

int main()
{
    LL b,p;

    while(~sf("%lld %lld %lld",&b,&p,&m))
    {
        pf("%lld\n",big_mod(b,p));
    }

    return 0;
}

পাওয়ার বা P যদি জোড় হয় তবে LL r = big_mod(n,p/2) % m; এই লাইন ইউস করা হইসে । এবং পরে একে অপরের সাথে গুন করা হইসে ।
তবে মনে রাখতে হবে মোড কিন্তু প্রত্যক অপারেশনের সাথে করতে হবে ।।  পাওয়ার যদি বেজোড় হয় তাহলে n এর মোডের সাথে P-1 গুন করে দিতে হবে । কারন 2^25 = 2 * 2^24 ;
আর হ্যাঁ , অবশ্যই প্রত্যেকের সাথে m mod করতে হবে ।।

********* আমরা যে নাম্বার দিয়ে কোন নাম্বার কে ভাগ করি তাকে বলি ভাজক, যে নাম্বারকে ভাগ করা হচ্ছে তাকে বলে ভাজ্য , ভাগ করে আমরা যে রেজাল্ট পাই তাকে বলে ভাগফল, আর যা অবশিষ্ট থাকে তাকে বলে ভাগশেষ । আমরা মোড করে কেবল ভাগশেষ পাই ।।
**** তো মোড করলে একটা লাভ হয় যে , আমরা বিশাল বড় একটা রেজাল্টকে অনেক ছোট করে ফেলতে পারি ।। এবং মনে রাখতে হবে  "" কোন ভাগশেষ কখনও ভাজ্য থেকে বড় হতে পারে না । "" 
আরেকটু ভাল ভাবে বললে, ভাগশেষ < ভাজ্য , মানে কোনো সংখ্যাকে m দিয়ে mod করা হলে সংখ্যাটি m এর থেকে বড় হতে পারবেনা

২৭ ডিসেম্বর ২০১৫

Summation of Divisors

Explanation ::

Thanks to Jane Alam Jan (founder of LightOj)

Code:: goes to Below :::


 /// Header file begin
#include <iostream>
#include <cstdio>
#include <cstring>
#include <map>
#include <string>
#include <vector>
#include <cmath>
#include <cctype>
#include <sstream>
#include <set>
#include <list>
#include <stack>
#include<utility>
#include <queue>
#include <algorithm>
/// End
//..........
/// Macro
#define sf scanf
#define pf printf
#define sfint(a) scanf("%d",&a)
#define sfl(a,b) scanf("%ld %ld",&a,&b)
#define sfll(a,b) scanf("%lld %lld",&a,&b)
#define sfd(a,b) scanf("%lf %lf",&a,&b)
#define sff(a,b) scanf("%f %f",&a,&b)
#define lp1(i,n) for(i=0;i<n;i++)
#define lp2(i,n) for(i=1;i<=n;i++)
#define mem(c,v) memset(c,v,sizeof(c))
#define cp(a) cout<<" "<<a<<" "
#define nl puts("")
#define sq(x) ((x)*(x))
#define all(x) x.begin(),x.end()
#define reall(x) x.rbegin(),x.rend()
#define sz size()
#define gc getchar()
#define pb push_back
/// End.........

/// Size
#define mx7 20000100
#define mx6 1500000
#define mx5 100005
#define mx4 1000100
#define inf 1<<30                                           //infinity value
#define eps 1e-9
#define mx (65540)
#define mod 1000000007
#define pi acos(-1.0)

/// Macros for Graph

#define white 0
#define gray 1
#define black -1
#define nil -2

using namespace std;
/***************/

/// typedef

typedef long long LL;
typedef long L;
typedef unsigned long long ull;
typedef unsigned long ul;
typedef unsigned int ui;
typedef pair<int, int> pii;
typedef vector<int>vi;
typedef vector<long long> vll;
typedef vector<long>vl;
typedef vector<char>vch;
typedef vector<string>vs;
typedef map<int,int>mpii;
typedef map<int,bool>mpbi;
typedef map<char,int>mpci;
typedef map<char,bool>mpbc;
typedef map<string,int>mpsi;
typedef map<long long,long long>mpll;

/// template

template<class T> T gcd(T a, T b ) {return b<=0?a:gcd(b,a%b);}
template<class T> T large(T a, T b ) {return a>b?a:b;}
template<class T> T small(T a, T b ) {return a<b?a:b;}
template<class T> T diffrnce(T a, T b) {return a-b<0?b-a:a-b;}


using namespace std;
//..................................................................................................................
template<class T> T setbit(T n, T pos){n=n|(1<<pos); return n;}
template<class T> T checkbit(T n, T pos){n=n&(1<<pos); return n;}

int prime[1],pr[100],plen=0;

void seieve(int n)
{
    int i,j,x=sqrt(n);

    prime[0]=setbit(prime[0],0);
    prime[0]=setbit(prime[0],1);

    for(i=4;i<=n;i+=2)prime[i>>5]=setbit(prime[i>>5],i&31);

    for(i=3;i<=x;i+=2)
    {
        if(!checkbit(prime[i>>5],i&31))
        {
            for(j=i*i;j<=n;j+=i)
            {
                prime[j>>5]=setbit(prime[j>>5],j&31);
            }
        }
    }

    for(i=2;i<=n;i++)
    {
        if(!checkbit(prime[i>>5],i&31))
        {
            pr[plen++]=i;
        }
    }
}

mpii mp;

void divisor(int n)
{
    int i,m=1,tmp,take=n;

    mp.clear();

    for(i=0;i<plen and sq(pr[i])<=n;i++)
    {
        if(!(n%pr[i]))
        {
            while(!(n%pr[i]))
            {
                mp[pr[i]]++;
                n/=pr[i];
                if(n==0 or n==1) break;
            }

            tmp=powl(pr[i],(mp[pr[i]] + 1));
            m*=((tmp-1)/(pr[i] - 1));
        }
    }

    if(n>1)
    {
        tmp=powl(n,2);
        m*=((tmp-1) / (n-1));
    }

    pf("Summation of the divisors of %d is %d :)\n",take,m);
    m=1;
}

int main()
{
    int n;
    seieve(100);

    cout << "Enter Number(up to 100) : ";

    while(sfint(n)==1)
    {
         divisor(n);

         cout << endl << "Enter Number(up to 100) : ";
    }

    return 0;
}

//================================================================================================================
/*

                                         Summation of Divisors
                                         =====================

Let the divisors of 60 = 1, 2, 3, 4, 5, 6, 10, 12, 15, 20, 30 and 60; Total=12;

So, the total Summation of that divisors is = 1+2+3+4+5+6+10+12+15+20+30+60 = 168;

Formula::
==========

( r ^ ( n + 1 ) - 1 ) / ( r - 1 );

**** r = prime factorization of that number. n = power of the prime factorization.

So, for 60 = 2^2 * 3^1 * 5^1 ;

r=2,3,5;

n=2,1,1;

result = ( ( 2 ^ ( 2 + 1 ) ) - 1 ) / (2-1) * ( ( 3 ^ ( 1 + 1 ) ) - 1 ) / (3-1) * ( ( 5 ^ ( 1 + 1 ) ) - 1 ) / (5-1);

=> result = 7 * 4 * 6 = 168 ;

so, result = 168;

*** In which function that we get the summation of divisor is called Sigma function ;)
*/

১৯ ডিসেম্বর ২০১৫

Find the Way to express a number by Consecutive Sum of integers

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

যেমন ১২ এর প্রাইম ফেক্টর গুলু হচ্ছে, ১২=২*২*৩;
এখানে বেজোড় প্রাইম ফেক্টর  কেবল ৩, যার পাওয়ার ১;
সুতরাং , আমাদের Way হচ্ছে = ১+০ = ১;

কিন্তু কথা হচ্ছে, যেহেতু সকল নাম্বারের একটা কমন ডিভিজর হল ১ এবং সেইসাথে যেহেতু ১ একটি বেজোড় নাম্বার, সেহেতু আমরা আমাদের আগের প্রাপ্ত মানের সাথে ১ যোগ করে দেব । 

So, the Way is = ১+(১) = ২;

আবার, ৯=৩^১*৩^১;
সুতরাং হবার কথা ১+১=২;
যেহেতু ১ সকল নাম্বারের ডিভিজর এবং বেজোড় নাম্বার সো Way হবে = ২+ (১) = ৩;

এবার কোডটা নিজে নিজে করে ফেলুন । আমি যদি প্রাইম নাম্বার কিংবা প্রাইম ফেক্টর বের করতে জানেন তাহলে এর কোড করা আপনার জন্য কোন ব্যাপার না ।

তবু নিচে কোডের লিঙ্ক টা দিয়ে দিলাম ... কোন প্রবলেমে না পড়া পর্যন্ত দেখবেন না আশা করি । 

( বিঃদ্রঃ আগে নিজে চেষ্টা করুন, না পারলে কোড দেখে এনালাইসিস করে নিজের মত করে করুন । কখনও কারো কোড কপি পেস্ট করে সাবমিট করবেন না । )

কোডের জন্যঃঃ  Uva 10290