Goharshady

New Member
ارسال ها
2,239
لایک ها
166
امتیاز
0
این همون سوالی نیست که تعداد صفرهای n! رو می خواد؟
 

Goharshady

New Member
ارسال ها
2,239
لایک ها
166
امتیاز
0

rezashiri

Well-Known Member
ارسال ها
1,458
لایک ها
325
امتیاز
83
Goharshady گفت
من فقط یه فهرست دارم که بالاش نوشته محیط.
اگه میشه لینکشو بده
توی این سایت به خاطر امنیت(!) چیزی لینک نمی شه!

بعد از ثبت نام باید وارد سیستم بشید(به صورت امن!) بعدش از قسمت مسئله برید توی فهرست بعدش از لیست موجود ACM_Training رو انتخاب کنید.
 

Goharshady

New Member
ارسال ها
2,239
لایک ها
166
امتیاز
0
برگردیم به بحث در مورد سوال FactorialsAgain:
این دو تا عدد را بدهید و ببینید چقدر طول می کشه:
1008322012 1964816169
 

SABB

New Member
ارسال ها
704
لایک ها
25
امتیاز
0
Goharshady گفت
برگردیم به بحث در مورد سوال FactorialsAgain:
این دو تا عدد را بدهید و ببینید چقدر طول می کشه:
1008322012 1964816169
سریع، ولی دقیق نمی دونم.
 

Goharshady

New Member
ارسال ها
2,239
لایک ها
166
امتیاز
0
SABB گفت
Goharshady گفت
برگردیم به بحث در مورد سوال FactorialsAgain:
این دو تا عدد را بدهید و ببینید چقدر طول می کشه:
1008322012 1964816169
سریع، ولی دقیق نمی دونم.
احتمالا اعداد را برعکس وارد کرده اید!! شاید برعکس می بینید! ولی اون جایگشت دیگه رو هم امتحان کنید
 

Goharshady

New Member
ارسال ها
2,239
لایک ها
166
امتیاز
0
[center:4230d03519]
[/center:4230d03519]من بالاخره این سوال رو گرفتم. نکته ی جالبی داره!
معلومه که تجزیه ی عدد مشکل اصلی ماست.
حالا یه ایده می زنیم. ببینید عدد مبنای ما حداکثر ۵۰۰ میلیون است. پس هر کدام از k ها را که تجزیه کنیم یا اول است یا یک عامل اول کمتر از sqrt(500000000) دارد. همه ی اعداد اول کمتر از sqrt(5*10^7) را پیدا می کنیم و در یک vector یا آرایه می ریزیم. ــ زمان صفر!! ــ بعد برای تجزیه ی هر عدد از اینها استفاده می کنیم. وقتی بخواهیم k را تجزیه کنیم ابتدا k را با اولین عدد لیست می سنجیم که ببینیم بخشپذیر هست یا نه بعد اگر بخشپذیر بود تا جای ممکن بر عدد داخل لیست تقسیمش می کنیم و همینطور پیش می ریم. اگر در نهایت k=1 بشه که تجزیه تمومه در غیر این صورت k اولیه یک عامل اول بزرگتر از اون sqrt داشته که نتیجه می گیریم k فعلی اوله چون همه ی عوامل اول قبلی رو حذف کرده ایم.
پس تجزیه خیلی سریعتر می شه.
این هم کد من:
http://snipt.net/goharshady/factorials-again-acm
البته تو این کد اعداد اول رو از قبل save کرده ام.
 

Goharshady

New Member
ارسال ها
2,239
لایک ها
166
امتیاز
0

rezashiri

Well-Known Member
ارسال ها
1,458
لایک ها
325
امتیاز
83
سوال بعدی:(محیط Allaame_Helli_Tehran_Olympiad_Algorithm_Class سوال LCS )
======================================================

کد من اینه ولی نمی دونم کجاش مشکل داره؟!؟

آقای گوهرشادی می شه مشکلشو بگید!؟

http://snipt.net/rezashiri/lcs-lcs
 

Goharshady

New Member
ارسال ها
2,239
لایک ها
166
امتیاز
0
الگوریتمتون چیه؟
به نظرم عجیبه که اینقدر کدتون کوتاه شده!!
 

rezashiri

Well-Known Member
ارسال ها
1,458
لایک ها
325
امتیاز
83
مشکل کدم رو فهمیدم ! ولی فعلا هنوز حلش نکردم....
 

rezashiri

Well-Known Member
ارسال ها
1,458
لایک ها
325
امتیاز
83
حالا مشکل این چیه!؟!

الگوریتمم:

از عدد اول در دنباله اول شروع می کنیم و یکی یکی تعداد دنباله های مشترک بعد از اون عدد رو پیدا می کنیم.

مثلا برای ورودی زیر:

4 4
1 2 3 5
5 2 3 1

اول می یایم 5 رو بررس می کینم که می شه 1 ، بعد می یایم3 رو بررسی می کنیم که می شه 2 تا و ...

آخرشم بزرگترین رو که پیدا کردیم اعضای دنباله مشترکشو چاپ می کنیم!

کد
#include <cstdio>
//#include <conio.h>

int main()
{
    int na,nb,a[10000],b[10000],tedad[1000],minj=0,sum=0,maxi,max=0;
    
    scanf("%d%d",&na,&nb);
    
    for(int i=0;i<na;i++)
	  scanf("%d",&a[i]);
	  
    for(int i=0;i<nb;i++)
	  scanf("%d",&b[i]);
start:	  
		    tedad[sum]=0;
    for(int i=sum;i<na;i++)
    {
		 
		  for(int j=0;j<nb;j++)
		  {
				 if(a[i]==b[j] && j>=minj) {minj=j; tedad[sum]++;}//peida kardan tedad zirdonbale moshtarak
		  }
    } 
    if(tedad[sum]>max){max=tedad[sum]; maxi=sum;}
    if(sum<na){
			minj=0;
			sum++;
			goto start;
			}

	   printf("%d",tedad[maxi]);
	   minj=0;
	   for(int i=maxi;i<na;i++)
    {
		  for(int j=0;j<nb;j++)
		  {
				 if(a[i]==b[j] && j>=minj) {minj=j; printf("\n%d %d",i+1,j+1);}//print zirdonbale ha
		  }
    } 
    

    
    //getch();
    return 0;
}
خودم نفهمیدم چی گفتم!
بعید میدونم شما هم ازش سر در بیارین!
 

rezashiri

Well-Known Member
ارسال ها
1,458
لایک ها
325
امتیاز
83
مثل این که این فراموش شد؟!
 

Goharshady

New Member
ارسال ها
2,239
لایک ها
166
امتیاز
0
این چی هست؟
 

rezashiri

Well-Known Member
ارسال ها
1,458
لایک ها
325
امتیاز
83

Goharshady

New Member
ارسال ها
2,239
لایک ها
166
امتیاز
0
خب من اینو نمی فهمم یک کمی کامنت بذارین و توضیح بدین
 

rezashiri

Well-Known Member
ارسال ها
1,458
لایک ها
325
امتیاز
83
اینم با کامنت گذاری:

کد
#include <cstdio>
//#include <conio.h>

int main()
{
    int na,nb,a[10000],b[10000],tedad[1000],minj=0,sum=0,maxi,max=0;
    
    scanf("%d%d",&na,&nb);
    
    for(int i=0;i<na;i++)
	  scanf("%d",&a[i]);
	  
    for(int i=0;i<nb;i++)
	  scanf("%d",&b[i]);
	  
start:	  
		    tedad[sum]=0;
		    
    for(int i=sum;i<na;i++)
    {
		 
		  for(int j=0;j<nb;j++)
		  {
				 if(a[i]==b[j] && j>=minj) {minj=j; tedad[sum]++;}// .شروع مي شوند sum پيدا کردن تعداد زير دنباله هايي که از 
		  }
    } 
    
    if(tedad[sum]>max){max=tedad[sum]; maxi=sum;}
    if(sum<na){  
			minj=0;
			sum++;
			goto start;//عددي که از آن شروع مي شود يکي بيشتر مي شود
			}

//az inja be bad ke bishtarin tedad ro peida kardim , adidi ke age az on adad donbale shoro besha bish tarin tol ro dare 
	   printf("%d",tedad[maxi]);
	   minj=0;
	   for(int i=maxi;i<na;i++)
    {
		  for(int j=0;j<nb;j++)
		  {
				 if(a[i]==b[j] && j>=minj) {minj=j; printf("\n%d %d",i+1,j+1);}//print zirdonbale ha
		  }
    } 
    

    
    //getch();
    return 0;
}
مثلا فرض کنید ورودی به صورت زیر است:

کد
4 4
9 6 7 8
8 6 7 9
اول می آد تعداد اعضا زیر دنباله ای که از عدد 9 شروع می شن رو حساب می کنه ، بعد همین کار رو برای 6 و ...

بیشترین تعداد اعضا رو در خروجی چاپ می کنه بعدشم چون عددی که از آن شروع بشود این تعداد بدست می آید رو داریم پس حالا از اون عدد شروع می کنیم و خروجی هارو یکی یکی چاپ می کنیم.

امیدوارم متوجه شده باشید...
 

rezashiri

Well-Known Member
ارسال ها
1,458
لایک ها
325
امتیاز
83
برای این که کامنت ها بهتر دیده بشه توی dev بریزیدش...
 
بالا