Sunday, July 31, 2016

UVA 324 - Factorial Frequencies solution

In this problem you just have to calculate the frequencies of numbers 0 to 9 and print them same as given in the output. So avoid wasting your time. Just pre-calculate factorials till 370 and do that has been said in the problem statement.

an accepted solution is given below:

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

vector<int> v[380];

void pre()
{
    v[0].push_back(1);

    for(int i=1;i<=370;i++)
    {
        long long int carry=0,s;

        for(int j=0;j<v[i-1].size();j++)
        {
            s=v[i-1][j]*i+carry;

            if(s>=10)
            {
                v[i].push_back(s%10);
                carry=s/10;
            }
            else
            {
                v[i].push_back(s);
                carry=0;
            }
        }

        if(carry>0)
        {
            while(carry!=0)
            {
                v[i].push_back(carry%10);
                carry=carry/10;
            }
        }
    }
}


int main()
{
    pre();

    int n;

    while(cin>>n && n!=0)
    {
        int a=0,b=0,c=0,d=0,e=0,f=0,g=0,h=0,l=0,j=0;

        cout<<n<<"! --"<<endl;

        for(int i=v[n].size()-1;i>=0;i--)
        {
            if(v[n][i]==0)
            {
                a++;
            }
            else if(v[n][i]==1)
            {
                b++;
            }
            else if(v[n][i]==2)
            {
                c++;
            }
            else if(v[n][i]==3)
            {
                d++;
            }
            else if(v[n][i]==4)
            {
                e++;
            }
            else if(v[n][i]==5)
            {
                f++;
            }
            else if(v[n][i]==6)
            {
                g++;
            }
            else if(v[n][i]==7)
            {
                h++;
            }
            else if(v[n][i]==8)
            {
                l++;
            }
            else if(v[n][i]==9)
            {
                j++;
            }

        }

        printf("   (0)   %d   (1)   %d   (2)   %d   (3)   %d   (4)   %d\n   (5)   %d   (6)   %d   (7)   %d   (8)   %d   (9)   %d\n",a,b,c,d,e,f,g,h,l,j);

    }

    return 0;

}

UVA 10338 - Mischievous Children Solution

problem link-click here

Here i see all the factorial problems at UVA are almost same. This problem is more easy bcz you just need to pre calculate  factorial till 20 and store them in an array. Then count the length of the input string and count the frequency of every character separately . then use the formula for getting how many unique ways of combination is possible which is  ( n! / multiple of repeated character's frequencies ).

an accepted code is given below:

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

vector<long long int> v;

void pre()
{
    v.push_back(1);

    for(int i=1;i<=20;i++)
    {
        v.push_back(v[i-1]*i);
    }
}

int main()
{
    pre();

    long long int t,i=1,n,s,w;
    cin>>t;

    while(t--)
    {
        char str[1000]="";
        bool arr[1000]={0};

        cin>>str;

        n=strlen(str);

        w=1;

        for(int i=0;i<strlen(str)-1;i++)
        {
            s=1;

            if(arr[str[i]]==0)
            {
                for(int j=i+1;j<strlen(str);j++)
                {
                    if(str[i]==str[j])
                    {
                        s++;
                    }
                }

                arr[str[i]]=1;
            }

           w=w*v[s];
        }

        cout<<"Data set "<<i<<": "<<v[n]/w<<endl;

        i++;
    }

    return 0;
}

Saturday, July 30, 2016

UVA 10220 - I Love Big Numbers ! solution

Problem link-click here

Same problem as 623 ans 568. See the solutions  for better understand in my previous post.

code is below:

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

vector<long long int> v[1005];

void result()
{
    v[0].push_back(1);
    v[1].push_back(1);
    int carry=0;

    for(int i=2;i<1001;i++)
    {
        int t=v[i-1].size();

        long long int s;

        for(int j=0;j<t;j++)
        {
            s=v[i-1][j]*i+carry;

            if(s>=10)
            {
                v[i].push_back(s%10);
                carry=s/10;
            }
            else
            {
                v[i].push_back(s);
                carry=0;
            }

        }

        if(carry>0)
        {
            while(carry!=0)
            {
                v[i].push_back(carry%10);
                carry=carry/10;
            }
        }
    }

}

int main()
{
    result();

    int n;

    while(cin>>n)
    {

        long long int s=0;

        for(int i=0;i<v[n].size();i++)
        {
            s=s+v[n][i];
        }

       cout<<s<<endl;
    }

    return 0;
}



UVA 568 - Just the Facts sotution

Problem link-click here

Nothing to say. same as problem 623 except some silly matter. read the question carefully.

pre-calculate factorial for 10000 numbers. then have a blast.

an accepted code is given below:

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

vector<long long int> v[m];

void generatef()
{
    v[0].push_back(1);
    v[1].push_back(1);

    for(int i=2;i<m;i++)
    {
       long long int r=0,s,t;

       t=v[i-1].size();

        for(int j=0;j<t;j++)
        {
            s=v[i-1][j]*i+r;

            if(s>=10)
            {
                v[i].push_back(s%10);
                r=s/10;
            }
            else
            {
                v[i].push_back(s);
                r=0;
            }
        }

        if(r>0)
        {
            while(r!=0)
            {
                v[i].push_back(r%10);
                r=r/10;
            }
        }

    }

}

int main()
{
    generatef();

    int n;

    while(scanf("%d",&n)==1)
    {
        cout.width(5);
        cout<<n<<" -> ";

        for(int i=0;i<v[n].size();i++)
        {
            if(v[n][i]!=0)
            {
                cout<<v[n][i]<<endl;
                break;
            }
        }

    }

    return 0;

}

UVA 623 - 500! solution

Problem link-click here

Believe me this is after all a very easy problem. you can easily solve it using 2D array or by processing string.

just pre-calculate 1000 factorial then for any number of N and just print the Nth row. solution is given below:

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

vector<long long int> v[m];

void generatef()
{
    v[0].push_back(1);
    v[1].push_back(1);

    for(int i=2;i<m;i++)
    {
       long long int r=0,s,t;

       t=v[i-1].size();

        for(int j=0;j<t;j++)
        {
            s=v[i-1][j]*i+r;

            if(s>=10)
            {
                v[i].push_back(s%10);
                r=s/10;
            }
            else
            {
                v[i].push_back(s);
                r=0;
            }
        }

        if(r>0)
        {
            while(r!=0)
            {
                v[i].push_back(r%10);
                r=r/10;
            }
        }

    }

}

int main()
{
    generatef();

    int n;

    while(scanf("%d",&n)==1)
    {
        cout<<n<<"!"<<endl;

        for(int i=v[n].size()-1;i>=0;i--)
        {
            cout<<v[n][i];
        }

        cout<<endl;
    }

    return 0;

}

Friday, July 29, 2016

Range & Format Specifiers Of All Data Types (In Details)

আমার জানা মতে এই ডাটাটাইপ এর বিষয়ে সবারই কিছুনা কিছু প্রবলেম থাকেই । এমনকি অনেক বাঘা বাঘা প্রগ্রামারদের ও এই বিষয়টাতে আবছা আবছা ধারনা থাকে , ক্লিয়ার ধারনা থাকেনা । কিন্তু ডাটাটাইপ সম্পরকে ক্লিয়ার ধারনা থাকা অত্যন্ত জরুরী নাহলে সব ঠিক থাকা সত্তেও বিভিন্ন্য অনলাইন জাজ এ বিনামূল্যে খেতে হবে WA . এই  WA কিন্তু যেমন তেমন জিনিস না, প্রগ্রামারদের জন্য এইটা একটা বিভীষিকার নাম। যাইহোক নিচে এই বিষয়ে বিস্তারিত আলোচনা করা হল।

সি তে অথবা সি++ এ যে ডাটা টাইপ আছে সেগুলার টাইপ এবং কিওয়ার্ড গুলা নিচে দেয়া হল

টাইপ কিওয়ার্ড
Booleanbool
Characterchar
Integerint
Floating pointfloat
Double floating pointdouble
Valuelessvoid
Wide characterwchar_t

এইখানে নিচের দুইটা ছাড়া বাকি সবগুলাই খুব কাজের টাইপ । Character, Integer, float, double এইগুলা  আবার কয়েক ভাগে বিভক্ত যেমনঃ 
  •                          ১। signed
  •                          ২। unsigned
  •                          ৩। short
  •                          ৪। long
এইগুলা দেখে ভয় পাওয়ার কিছু নাই । তেমন কিছুই না । সাইনড মানে হইল রেঞ্জ মাইনাস থেকে প্লাস পর্যন্ত আর আন্সাইন্ড মানে হইল শুধুমাত্র প্লাস পর্যন্ত নিচের রেঞ্জ গুলা দেখলে আরো ভাল বুঝতে পারবে।

টাইপ
বাইটের সংখ্যা
বিভিন্যতা
রেঞ্জ
int
4
signed (%d)
–2,147,483,648 to 2,147,483,647 ( -2^31 to 2^31-1 )
unsigned int
4
unsigned (%u)
0 to 4,294,967,295 ( 0 to 2^32-1 )
__int8
1
char (%c)
–128 to 127 ( -2^7 to 2^7-1 )
unsigned __int8
1
unsigned char (%c)
0 to 255 ( 0 to 2^8-1 )
__int16
2
short, short int, signed short int (%hi)
–32,768 to 32,767 ( -2^15 to 2^15-1 )
unsigned __int16
2
unsigned short, unsigned short int (%hu)
0 to 65,535 ( 0 to 2^16-1 )
__int32
4
signed, signed int, int (%d)
–2,147,483,648 to 2,147,483,647 ( -2^31 to 2^31-1 )
unsigned __int32
4
unsigned, unsigned int(%u)
0 to 4,294,967,295 ( 0 to 2^32-1 )
__int64
8
long long, signed long long (%lld)
–9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 ( -2^63 to 2^63-1 )
unsigned __int64
8
unsigned long long(%llu)
0 to 18,446,744,073,709,551,615 ( 0 to 2^64-1 )
bool
1
none
false or true
char
1
none
–128 to 127 by default
0 to 255 when compiled by using /J
signed char
1
none
–128 to 127 ( -2^7 to 2^7-1 )
unsigned char
1
none (%c)
0 to 255 ( 0 to 2^8-1 )
short
2
short int, signed short int (%hi)
–32,768 to 32,767  ( -2^15 to 2^15-1 )
unsigned short
2
unsigned short int(%ui)
0 to 65,535 ( 0 to 2^16-1 )
long
4
long int, signed long int(%ld)
–2,147,483,648 to 2,147,483,647 ( -2^31 to 2^31-1 )
unsigned long
4
unsigned long int(%lu)
0 to 4,294,967,295 ( 0 to 2^32-1 )
long long
8
none (but equivalent to __int64)(%lld)
–9,223,372,036,854,775,808 to 9,223,372,036,854,775,807  ( -2^63 to 2^63-1 )
unsigned long long
8
none (but equivalent to unsigned __int64) (%lld)
0 to 18,446,744,073,709,551,615 ( 0 to 2^64-1 )
enum
varies
none
float
4
none (%f)
3.4E +/- 38 (7 digits)
double
8
none (%lf)
1.7E +/- 308 (15 digits)
long double
same as double
none (%llf)
Same as double
wchar_t
2
__wchar_t
0 to 65,535
উপরে প্রতিটা টাইপ দুইবার করে লিখা আছে যেন এই সুযোগে দুইবার করে পড়া হয়ে যাই । মোটামুটি এইগুলাই হল ডাটা টাইপের বিষয়গুলা । আশা করি হেল্পফুল হবে। এতক্ষণ আমাকে সহ্য করার জন্য ধন্যবাদ । 



Thursday, July 28, 2016

10055 - Hashmat the Brave Warrior

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=996

এই প্রবলেমটা সবচেয়ে সহজ প্রবলেম হিসেবে পরিচিত UVA তে । সবাই একবার পড়ার পরই বুঝতে পারে কি করতে হবে । সাথে সাথে শুরু করে দেই প্রোগ্রাম লিখা ঠিক এইভাবে  int a,b,x;
if(a>b) then x=a-b; else x=b-a । ভাই একটু ভাল করে পড় প্রবলেমটা। এই প্রবলেমটাতে যেই ট্রিক্টা আছে সেটা হল ২^32 পর্যন্ত ইনপুট  নেয়ার বিষয়টা। ইন্টিজার কখনও 2^32 পর্যন্ত ইনপুট নিতে পারেনা। ইন্টিজার এর রেঞ্জ হল -2^31 থেকে  +2^31-1 = -2147483648 থেকে  +2147483647 পর্যন্ত তাই এই প্রব্লেমটাতে ইন্তিজার ব্যবহার করা দণ্ডনীয় অপরাধ হবে। কিন্তু Unsigned long integer or long long int ব্যবহার করা যাবে। কারন Unsigned long integer 2^32-1= ৪২৯৪৯৬৭২৯৫ পর্যন্ত ইনপুট নিতে পারে আর  long long int 2^64-1 = –9,223,372,036,854,775,808 থেকে 9,223,372,036,854,775,807  পর্যন্ত ইনপুট নিতে পারে । সো অনায়াসে চোখ বন্ধ করে তুমি  long long int  অথবা  Unsigned long integer ব্যবহার করতে পারো। সি তে long long int  এবং  Unsigned long integer এর  ফরমেট স্পেছিফাইয়ার হল যথাক্রমে  %lu  এবং  %lld ।

an accepted programme is given below :

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

int main()
{
    unsigned long int a,b,m;

    while(scanf("%lu%lu",&a,&b)==2)
    {
        if(b>a)
        {
            m=b-a;
            cout<<m<<endl;

        }

        else
        {
            m=a-b;
            cout<<m<<endl;
        }


    }

    return 0;
}


UVA 10220 - I Love Big Numbers




This is one of the Big integer problem . Better to solve using java as Java has an built in datatype Biginteger. that can contain any range of int variable . here i have use C++ so i have to use 2D  int  array to solve. process is as follows :

Just calculate 1000! (from 1 to 1000) by easy using array product.
Use vector if you can as you can determine the  size of vector whenever you want whereas for int array you can't determine size using any function.

An accepted solution  is given below:
( 1st try yourself )

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

vector<long long int> v[1005];

void result()
{
    v[0].push_back(1);
    v[1].push_back(1);
    int carry=0;

    for(int i=2;i<1001;i++)
    {
        int t=v[i-1].size();

        long long int s;

        for(int j=0;j<t;j++)
        {
            s=v[i-1][j]*i+carry;

            if(s>=10)
            {
                v[i].push_back(s%10);
                carry=s/10;
            }
            else
            {
                v[i].push_back(s);
                carry=0;
            }

        }

        if(carry>0)
        {
            while(carry!=0)
            {
                v[i].push_back(carry%10);
                carry=carry/10;
            }
        }
    }

}

int main()
{
    result();

    int n;

    while(cin>>n)
    {

        long long int s=0;

        for(int i=0;i<v[n].size();i++)
        {
            s=s+v[n][i];
        }

       cout<<s<<endl;
    }

    return 0;
}

Best of luck.........:D