Showing posts with label LightOj Solution With Logic. Show all posts
Showing posts with label LightOj Solution With Logic. Show all posts

Sunday, July 9, 2017

1225 - Palindromic Numbers (II) Lightoj Problem Solution & Logic

http://www.lightoj.com/volume_showproblem.php?problem=1225
খুবই সহজ একটা প্রোবলেম , একটা সংখ্যা দেয়া থাকবে - তোমায় বলতে হবে , সেটা Palindromic কি না ?? Palindromic মানে , যে সংখ্যাকে উলটা করলেও , একই রকম দেখায় - এর মানে , তার মানের কোনো চেঞ্জ হয় না । যেমন , ১২২১ । এটাকে ,উলটা করে যদি লেখো , মানে শেষ থেকে যদি লেখো , তাহলেও ১২২১ ই হবে , কিন্তু - যদি সংখ্যাটি যদি - ১২৩৪ হতো , তাহলে উলটা করে লিখলে হতো ,৪৩২১ এর মানে - সংখ্যাটি চেঞ্জ হয়ে যেতো । এখন দেখবো,একটি - সংখ্যাকে কিভাবে উলটো করা যায়?নীচে  দেখো

ধরো , ১৮৯ কে রিভার্স করবো , তাহলে একটি variable n ধরে নেই যার মান , প্রথমে ০ ।

  ১৮৯ কে যদি ১০ দিয়ে ভাগ দিয়ে ভাগশেষ বের করতে যাই , তাহলে হবে  ৯ -এখন ১৮৯ কে ১০ দিয়ে ভাগ করে ফেলি , পাবো ১৮  এখন এই প্রক্রিয়াই আবার খাটাই। আর , ভাগশেষ  ৯  কে  আগের  n  এর মান কে ১০ দিয়ে গুণ দিয়ে তার সাথে যোগ দেই । একটা variable n
এর ভিতরে রাখি ,  n = n*১০ + ৯ == ০*১০+ ৯ ==  ৯।

এখন ১৮ কে যদি ১০ দিয়ে ভাগ দিয়ে ভাগশেষ বের করতে যাই , তাহলে হবে ৮ -এখন ১৮ কে ১০ দিয়ে
ভাগ করে ফেলি , পাবো  ১   এখন এই প্রক্রিয়াই আবার খাটাই। আর , ভাগশেষ  ৮  কে  আগের  n  এর মান কে ১০ দিয়ে গুণ দিয়ে তার সাথে যোগ দেই । একটা variable nএর ভিতরে রাখি ,  n = n*১০ + ৯ == ৯*১০+ ৮ ==  ৯৮ ।    

তাহলে , এভাবে যদি  ভাগফল  0  না হওয়া অবদি চালাই , তাহলে কিন্তু  ১৮৯ এর উলটো মান ৯৮১ পেয়ে যাবো , চলো কোড দেখি ---

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>

//Nayeem Mollick Joy ,Applied Physics And Electronic Engineering, University Of Rajshahi.

bool palindrome(int x)
{
    int ans;
    int temp;

    temp = x;
    ans = 0;

    while(x) {
        ans = ans * 10 + x % 10;
        x = x / 10;
    }

    return ans == temp;
}


int main()
{

    int x;
    int t;
    scanf("%d", &t);

    for (int cs = 1; cs <= t; cs++) {
        scanf("%d", &x);
        palindrome(x) ? printf("Case %d: Yes\n", cs) : printf("Case %d: No\n", cs);
    }
    return 0;
}

1294 - Positive Negative Sign Lightoj Problem Solution & Logic

http://www.lightoj.com/volume_showproblem.php?problem=1294
-1 -2 -3 +4 +5 +6 -7 -8 -9 +10 +11 +12

 ধরো , ইনপুটে দেয়া আছে - n = 12 and m =3 - তাহলে, উপরের সিরিজ'টি হবে ।
ধারা'র নিয়মটি হলো - ১ থেকে ১২ অবদি সংখ্যা'র যোগফল -কিন্তু, m এর মানের উপর ডিপেন্ড করে 
কিছু সংখ্যা এর মান হবে নেগেটিভ । লুপ খাটিয়ে ইজিলি করা যাবে , কিন্তু - Time Limit Exceeded 
 হবার সম্ভাবনা থাকবে  । তাই , অন্যপথে - আমাদের হাটতে হবে

 এখন, একটূ ভালোভাবে লক্ষ করলে একটা বিষয় ক্লিয়ার হবে ,খেয়াল করি - ধারাটি , একটু সুবিধামত লিখে ফেলি ------------------

-1 + 4    -2+5    -3+6    -7+10    -8+11    -9+12 

m এর মান ৩ হবার কারণে - ৩টি সংখ্যা পরপর ৩ টি সংখ্যা নেগেটিভ ,হয়েছে - এটাকে উপরের নতুন
গোছানো ধারা অনুযায়ী লক্ষ করলে , দেখতে পাচ্ছি মোট  n/2 = 6 ( এখানে যেহেতু,  n=12 ) টি অংশ পেয়েছি , যে অংশের প্রত্যেকটির মান m এর মানের সমান ( এখানে ,  m==3) । যেহেতু ,  n/2  সংখ্যক পার্ট যাদের মান  m,   এখন বুঝতেই পারছো  , ধারাটির যোগফল হবে   m*(n/2)  == 18  | | 

চলো , কোড দেখি 

#include<iostream>
#include<cstdio>
#include<cmath>


using namespace std;

    int main()
    {
        int T;
        cin>>T;
        long long int n,m;

        for(int i=1;i<=T;i++)

        {
            cin>>n>>m;
            printf("Case %d: %lld\n",i,(n*m)/2);
        }

        return 0;
    }
 


1136 - Division by 3 Lightoj Problem Full Logic & Solution

http://www.lightoj.com/volume_showproblem.php?problem=1136
একটু ঝামেলার একটি প্রোব্লেম ,তারপরো চাইলে - বিষয়টা খুবই আনন্দদায়ক ।
প্রথমেই লক্ষ করি , যে - তিনটি ক্রমিক সংখ্যার যোগফল সবসময় ৩ দিয়ে বিভাজ্য হয় ।
যেমন,            x + ( x+1) + ( x+2) == 3x + 3 = 3(x+1)
                        3(x+1) সংখ্যাটি যেহেতু , ৩ এর গুনিতক । সুতরাং , সংখ্যাটি অবশ্যাই ৩ দিয়ে বিভাজ্য ।

এখন প্রোবলেম-এ বলা আছে  যে- একটা সিকুয়েন্স এর কথা ,যেটা ক্রমিকতা বজায় রেখে বাড়তে থাকবে
                    ১ ,     ১২    ,    ১২৩   ,   ১২৩৪  ,   ১২৩৪৫   ,  ১২৩৪৫৬ ..................
                   ১ম     ২য়         ৩য়          ৪র্থ             ৫ম                ৬ষ্ঠ 

তোমাকে ইনপুট-এ দুইটা সংখ্যা দেয়া থাকবে , যেমন ৩ ও ৫ এর মানে হলো , তোমায় বুঝতে হবে - এই সিকুয়েন্স এর    ৩য়  ও  ৫ম  তম সংখ্যা'গুলির মাঝে কয়টি সংখ্যা পাওয়া যাবে (৩য় ও ৫ম সংখ্যা সহ )  , যেটা  ৩ দিয়ে বিভাজ্য হবে ?? 

এখন আমরা জানি যে , প্রত্যেক'টি ত্রয়ী'তে  যেমন - ( ১ ,     ১২    ,    ১২৩  )  [ তিন'টি মিলে একটি ত্রয়ী ]
এমন একটি ,সংখ্যা থাকে ( এখানে, ১২৩ ) যেটা তিন'টি ক্রমিক সংখ্যা দিয়ে গঠিত । অর্থাৎ , এদের যোগফল হবে -   x + ( x+1) + ( x+2) == 3x + 3 = 3(x+1)  যা, ৩ দিয়ে বিভাজ্য । ডিজিট'গুলির যোগফল যদি ৩ দিয়ে বিভাজ্য হয় , তাহলে সংখ্যাটি'ও ৩ দিয়ে বিভাজ্য হবে  অর্থাৎ , ১২৩ অবশ্যই ৩ দিয়ে বিভাজ্য হবে ।খেয়াল করে দেখো , প্রথম ত্রয়ী'র মধ্যে - ১২ ও দ্বিতীয় ত্রয়ী'র মধ্যে ১২৩৪৫ , ৩ দ্বারা বিভাজ্য - এরকমভাবে প্রত্যেক ত্রয়ীর মধ্যেই মোট ২ টা করে সংখ্যা থাকবে - যেটা ৩ দিয়ে বিভাজ্য হবে ।

অর্থাৎ , তাহলে তোমাকে বুঝতে হবে - তোমাকে যে ইনপুট দেয়া হবে - ধরো, ৬ এর মানে ৬ পর্যন্ত এরকম ত্রয়ী আছে  ৬ / ৩ = ২ টা , আর প্রত্যেক ত্রয়ী'তে যেহেতু, ২ টা করে সংখ্যা ৩ দ্বারা বিভাজ্য - সুতরাং , এখানেও তাহলে      ৬ষ্ঠ   অবদি , মোট ২x২ = ৪ টা সংখ্যা ৩ দিয়ে বিভাজ্য , বিশ্বাস না হলে চেক করে দেখো ।  আর , ধরো , ইনপুট দিলো - ৫ তাহলে ত্রয়ী আছে ৫/৩=১ টা , মোট ৩ দ্বরা বিভাজ্য সংখ্যা আছে ১*২ == ২ টা !! কিন্তু , আসলে কিন্তু নয়- কারণ ,আরো একটা ত্রয়ী'র ২য় সংখ্যা এখানে ঢূকে গেছে , তাই - মোট ৩ দ্বারা বিভাজ্য সংখ্যা হবে ২+১=৩ টা , ৫ম সংখ্যা অবদি । অরথাত, ভাগশেষ ২ হলে (৫%৩==২) আরো এক যোগ করতে হবে , আমাদের ।  তাহলে , এবার একটু কোড'টা দেখে ফেলি , নাকি ???

#include<bits/stdc++.h>

//Nayeem Mollick Joy, Applied physics & Electronic Engineering , University of Rajshahi.

using namespace std;



int divisiblecount(int n) {
   
    if (n==0) {
        return 0;
    }
   
    int ans = (n / 3) * 2;
   
    if (n % 3 == 2)
       
    {
        ans=ans+1;
    }
   
    return ans;
}

int main() {
   
    int T, cases = 1, a, b;
   
    scanf("%d", &T);
   
    while (T--) {
           
        scanf("%d %d", &a, &b);
       
        printf("Case %d: %d\n", cases++ , divisiblecount(b) - divisiblecount(a - 1));
    }
    return 0;
}

1214 - Large Division Lightoj problem Solution & Logic

http://www.lightoj.com/volume_showproblem.php?problem=1214

   খুব সহজ একটি , প্রোবলেম .\ কিছুটা https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=3001      
  এই প্রোবলেম এর মতো

তোমাকে দুইটা নাম্বার  a&b  দেয়া থাকবে । বলতে হবে ,a সংখ্যাটি ,b  দ্বারা বিভাজ্য কি ণা ??
এখন যেহেতু ,a অনেক বড় সংখ্যা - তাই ,এটা string  আকারে নিতে হবে  | এখানে , মনে রাখবা -a
কিন্তু নেগেটিভ সংখ্যা'ও হতে পারে । তাই , a যদি নেগেটিভ সংখ্যা'ও হয়-তাহলে , string এর লুপ ঘুরানোর সময় - string এর প্রথম s[0] ignore করে , s[1] থেকে আমাদের লুপ ঘুরিয়ে কাজ করতে হবে ।
কোড এর ভেতরে , আমরা - j দিয়ে এই কাজ করেছি । আর বেশী ব্যাখ্যা দিবো না ,কারণ । যে প্রক্রিয়াতে ,
কাজ করেছি সেটা নিয়ে এর আগে , এখানে http://nayeemmollickjoy.blogspot.com/2017/07/11879-multiple-of-17-uva-solution-logic.html

আলোচনা করেছি , কিভাবে ? বড় সংখ্যা, কোনো ছোট সংখ্যা দিয়ে বিভাজ্য কি না ? সেটা কিভাবে , চেক করতে হয় ,চাইলে দেখে নিতে পারো ।

এবারে কোড দেখে নাও , রিফ্রেশ হও

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<vector>
#include<cstring>
#include<cmath>

//Nayeem Mollick Joy ,Applied Physics And Electronic Engineering,University Of Rajshahi.

using namespace std;

int main()

{
    int T,rem;
    cin>>T;
    string s;
    long long int b,n,k,j;
    for(int i=1;i<=T;i++)

    {
        cin>>s>>b;

        int l=s.size();

        if(s[0]=='-')
        {
            j=1;
        }

        else
        {
            j=0;
        }
        if(b<0)
        {
            b=b*(-1);
        }
         n=0;
         int count=0;
         for(k=j;k<l;k++)
         {
             n=(s[k]-'0')+n*10;
             n=n%b;
         }
         if(n)
         {
             printf("Case %d: not divisible\n",i);
         }
          else
             printf("Case %d: divisible\n",i);
         }

         return 0;
    }