SABB

New Member
ارسال ها
704
لایک ها
25
امتیاز
0
Goharshady گفت
فرض کنید می خواهیم از طبقه ی H تعدادی آجر را انتقال بدهیم. هر آجر را به یکی از k طبقه ی زیری که min تعداد آجر را دارد انتقال می دهیم. ــ توجه کنید که min بعد از انتقال آجرها update می شود ــ
حالا ثابت کنید این کار درسته. ــ اثباتش خیلی راحته ــ
ترتیبش کدوم وریه؟ از پایین به بالا شروع می کنیم ؟
 

Goharshady

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

SABB

New Member
ارسال ها
704
لایک ها
25
امتیاز
0
Goharshady گفت
از بالا به پایین
یعنی برای ورودی k=2 و طبقه های

5
7
2
3

میاد 5 رو با 2 جمع می کنه و بعد 7 رو با 3؟؟
 

Goharshady

New Member
ارسال ها
2,239
لایک ها
166
امتیاز
0
اول ۵ رو با ۲ جمع می کنه می شه
۷
۷
۳
بعد از ۷ اول ۴ تاشو به ۳ می ده که می شه
۳
۷
۷
بعد ۳ تای باقی مانده را بین ۲ طبقه ی پایین که مساوی هستند تقسیم می کنه
۸
۹
بعد هم که تمومه.
اینطوری به ۹ می رسیم که همون minimum هم هست
 

rezashiri

Well-Known Member
ارسال ها
1,458
لایک ها
325
امتیاز
83
این سوال که با توضیحات آقای گوهرشادی راحت حل می شه (کافیه به کد من یه حلقه تکرار اضافه بشه که min رو پیدا کنه!)


سوال بعدی(هفتمین مسابقه اینترنتی شریف)

این سوال رو قبلا گذاشتم ولی با محدودیت خیلی کمتر از این...

راستی سایت http://acm.sharif.ir هم خیلی جالبه ها ....

برای دریافت سوال برید توی این سایت عضو شید بعد برید به فهرست بعد برید تو محیط ACM_Training بعد سوال factorialsagain

رو پیدا کنید.

راستی می تونید جوابتونو همون جا submit کنید ببینید درسته یا نه!؟

فکر نکنم خیلی سوال راحتی باشه!؟
 

Olympiad

New Member
ارسال ها
1,268
لایک ها
134
امتیاز
0
اين كد منه اما اعداد بزرگ رو ساپورت نميكنه
..........

کد
#include <conio.h>
#include <iostream>
 using namespace std;
 long long f(long long k)
  {
    long long ans=1;
    for(long long i=1;i<=k;i++)
	ans*=i;
    return ans;
  }
  int main()
   {
	 int n,k,count=0;
	 cin>>n>>k;
	 int a[1000];
	 long long x=f(n);
	 while(x>=k)
	   {
		if(x%k==0)
		  {
		   count++;
		   x/=k;
		  }
		else
		 break;
		}
	   cout<<count;
	 getch();
	 return 0;
   }
 

SABB

New Member
ارسال ها
704
لایک ها
25
امتیاز
0
این کد منه. اعداد بزرگ رو ساپورت میکنه ولی تایم لیمیت میشه:

کد
#include <iostream>

using namespace std;

unsigned long long num(unsigned long long n,unsigned long long k)
{
    unsigned long long output=0,m=k;
    while(n/m!=0)
    {
			  output+=n/m;
			  m*=k;
    }
    return output;
}

unsigned long long taj(unsigned long long n,unsigned long long a[],unsigned long long p[])
{
	unsigned long long i=2,j=0;
	while(n>1)
	{
			if(n%i==0)
			{
					p[j]=0;
					a[j]=i;
					while(n%i==0)
					{
							   p[j]++;
							   n/=i;
					}
					j++;
			}
			i++;
	}
	return j;
}

unsigned long long zero(unsigned long long x,unsigned long long y)
{
    unsigned long long a[100],p[100],l,i,d[100];
    int min=-1;
    l=taj(y,a,p);
    for(i=0;i<l;i++)
	  d[i]=0;
    for(i=0;i<l;i++)
	  d[i]+=num(x,a[i]);
    for(i=0;i<l;i++)
    {
	  d[i]/=p[i];
	  if((d[i]<min)||(min==-1))
		min=d[i];
    }
    return min;
}

int main()
{
    unsigned long long x,y;
    do{ 
	   cin >> x >> y;
	   if((x!=0)||(y!=0)) cout << zero(x,y) << endl;
    } while((x!=0)||(y!=0));
    return 0;
}
[I][I][I][I][I][I][I]
[/I][/I][/I][/I][/I][/I][/I]
 

Olympiad

New Member
ارسال ها
1,268
لایک ها
134
امتیاز
0
ميشه يه توضيح راجع به كدت بدي ؟!!؟!!
 

SABB

New Member
ارسال ها
704
لایک ها
25
امتیاز
0
Olympiad گفت
ميشه يه توضيح راجع به كدت بدي ؟!!؟!!
اینو خیلی وقت پیش (وقتی اولین بار آقای شیری سوالو گذاشتند) نوشتم. الآن یادم نیست ولی الآن بررسیش میکنم یادم میاد.
 

Olympiad

New Member
ارسال ها
1,268
لایک ها
134
امتیاز
0
SABB گفت
Olympiad گفت
ميشه يه توضيح راجع به كدت بدي ؟!!؟!!
اینو خیلی وقت پیش (وقتی اولین بار آقای شیری سوالو گذاشتند) نوشتم. الآن یادم نیست ولی الآن بررسیش میکنم یادم میاد.
يعني شما همه ي كدهاتون رو نگه ميداريد ؟!؟!؟ يا تو SNIPT گذاشته بوديد ؟!
 

SABB

New Member
ارسال ها
704
لایک ها
25
امتیاز
0
اول مبنا رو تجزیه می کنیم.
بعد برای تک تک عوامل اولش مثل p مقدار d_i رو برابر
قرار می دیم (i برابر شماره ی اون عامل اوله ست).

بعد هم همه ی d_i ها رو تقسیم به توان عامل اول i ام کردم.
مینیمم d_i ها میشه تعداد صفر ها.
 

Olympiad

New Member
ارسال ها
1,268
لایک ها
134
امتیاز
0
يه سوال !!!!!!!!

BIGNUM تقسيم چجوريه !!!!!!!!!؟؟؟؟؟؟؟؟؟؟
 

SABB

New Member
ارسال ها
704
لایک ها
25
امتیاز
0
Olympiad گفت
SABB گفت
Olympiad گفت
ميشه يه توضيح راجع به كدت بدي ؟!!؟!!
اینو خیلی وقت پیش (وقتی اولین بار آقای شیری سوالو گذاشتند) نوشتم. الآن یادم نیست ولی الآن بررسیش میکنم یادم میاد.
يعني شما همه ي كدهاتون رو نگه ميداريد ؟!؟!؟ يا تو SNIPT گذاشته بوديد ؟!
تو Snipt نگه میدارم.
 

SABB

New Member
ارسال ها
704
لایک ها
25
امتیاز
0
Olympiad گفت
يه سوال !!!!!!!!

BIGNUM تقسيم چجوريه !!!!!!!!!؟؟؟؟؟؟؟؟؟؟
نمی دونم. ولی میدونم باید مثل اول دبستان عمل کنید... از کنار جدا کنید، بعد...
 

SABB

New Member
ارسال ها
704
لایک ها
25
امتیاز
0
Olympiad گفت
SABB گفت
Olympiad گفت
يه سوال !!!!!!!!

BIGNUM تقسيم چجوريه !!!!!!!!!؟؟؟؟؟؟؟؟؟؟
نمی دونم. ولی میدونم باید مثل اول دبستان عمل کنید... از کنار جدا کنید، بعد...
اول ديستان كه تقسيم ياد نميدادن !!!!!!!!
من تا اون جا که یادمه هر سال همه چی یاد میدادن بعد سال بعدش میومدن بهمون می گفتن « خاک تو سرتون! این روشی که پارسال یاد گرفتین خیلی مسخره و به درد نخوره! » . بعدش هم یه روش جدید یاد میدادن که سال بعد دوباره همین اتفاق می افتاد... یکی نبود بگه خدا پدرتون رو بیامرزه همون اول بهترین روشو میگفتین دیگه
 

Olympiad

New Member
ارسال ها
1,268
لایک ها
134
امتیاز
0
كد اون سوال "عدد اول" كه بدون حلقه هاي شرطي بود رو .... بذاريد !!!!
 

SABB

New Member
ارسال ها
704
لایک ها
25
امتیاز
0
Olympiad گفت
كد اون سوال "عدد اول" كه بدون حلقه هاي شرطي بود رو .... بذاريد !!!!
شاید چون اشتباه متوجه شدید نمیتونین حل کنید وگرنه خیلی آسونه. مثلا این تکه هیچ اشکالی نداره:
(++for(i=2; n%i!=0; i​
چون کار یک if رو عمل نمی کنه، ولی این اشکال داره:
(++for(i=2; (n%i!=0) && (i<3); i​
 

SABB

New Member
ارسال ها
704
لایک ها
25
امتیاز
0
جوابا رو تو وبلاگ گذاشتم ولی فکر کنم با این راهنماییم آسون شده باشه.
 
بالا