প্রব্লেমঃ যেকোন কম্পোজিট নাম্বারকে এক বা একাধিক প্রাইম নাম্বারের গুনফল আকারে প্রকাশ করা যায় । যেমন
৪= ২*২ (২ টি প্রাইম)
৬= ২*৩ (২ টি প্রাইম)
৮= ২*২*২ (৩ টি প্রাইম)
একটি নাম্বার দেওয়া থাকবে সে নাম্বারের ফ্যাক্টোরিয়ালের এরকম মোট কতটি প্রাইম দ্বারা প্রকাশ করা যেতে পারে তা বের করতে হবে।
যেমন, ৮! = ১*২*৩*৪*৫*৬*৭*৮
= ১*২*৩*২*২*৫*২*৩*২*২*২ (১১ টি)
প্রব্লেম হিন্টঃ প্রথমে প্রতিটি নাম্বারের প্রাইম ফ্যাক্টর বের করতে হবে। সর্বোচ্চ ভেলু যেহেতু ১০০০০০০ তাই সেক্ষেত্রে ভুলেও সাধারনভাবে ফ্যাক্টর বের করা যাবেনা। তারপর ফ্যাক্টোরিয়াল মানগুলো যোগ করা ওই পজিশনে বসিয়ে রাখতে হবে এবং প্রিন্ট করে দিলেই কাজ শেষ।
কোডঃ
৪= ২*২ (২ টি প্রাইম)
৬= ২*৩ (২ টি প্রাইম)
৮= ২*২*২ (৩ টি প্রাইম)
একটি নাম্বার দেওয়া থাকবে সে নাম্বারের ফ্যাক্টোরিয়ালের এরকম মোট কতটি প্রাইম দ্বারা প্রকাশ করা যেতে পারে তা বের করতে হবে।
যেমন, ৮! = ১*২*৩*৪*৫*৬*৭*৮
= ১*২*৩*২*২*৫*২*৩*২*২*২ (১১ টি)
প্রব্লেম হিন্টঃ প্রথমে প্রতিটি নাম্বারের প্রাইম ফ্যাক্টর বের করতে হবে। সর্বোচ্চ ভেলু যেহেতু ১০০০০০০ তাই সেক্ষেত্রে ভুলেও সাধারনভাবে ফ্যাক্টর বের করা যাবেনা। তারপর ফ্যাক্টোরিয়াল মানগুলো যোগ করা ওই পজিশনে বসিয়ে রাখতে হবে এবং প্রিন্ট করে দিলেই কাজ শেষ।
কোডঃ
#include <bits/stdc++.h>
#include <cstdio>
#define MAX 1000001
using namespace std;
int factors[MAX];
int factorialcount[MAX];
int x, temp;
int primeFactor(int x)
{
int count = 0;
int i,j;
for(j=2;j*j<=x;j++)
{
if(x%j == 0)
{
count++;
x= x/j;
j= 1;
}
}
if(x>1)
count++;
return count;
}
int main()
{
int n, i, sum;
factors[1] = 0;
for(i= 2;i<MAX;i++)
factorialcount[i] = factorialcount[i-1]+ primeFactor(i);
while(scanf("%d", &n)!= EOF)
{
printf("%d\n",factorialcount[n]);
}
return 0;
}
Great...........!
ReplyDeleteExcellent
ReplyDelete