蒟蒻求教,60pts
查看原帖
蒟蒻求教,60pts
183609
hhoppitreeMadeline楼主2020/8/20 13:55
#include<bits/stdc++.h>
#define int long long 
#pragma GCC optimize(2)
#define maxlen (4000+5)
using namespace std;
class BigInt{
	private:
		int len;
		int num[maxlen];
	public:
		BigInt(){
			len=0;
			memset(num,0,sizeof(num));
			return;
		}
		inline int INT(){
			int res=0;
			for(register int i=0;i<len;i++)res=(res<<3)+(res<<1)+num[i];
			return res;
		}
		void read(){
			string s;cin>>s;
			len=s.size();
			for(register int i=0;i<len;i++)num[i]=s[len-i-1]-'0';
			return;
		}
		void write(char c='\n'){
			for(register int i=len-1;i>=0;i--)putchar(num[i]+'0');
			putchar(c);
			return;
		}
		void down(int x){
			BigInt res;res.len=0;
			while(x){
				res.num[res.len++]=x%10;
				x/=10;
			}
			*this=res;
			return;
		}
		bool operator<(BigInt y){
			BigInt x=*this;
			if(x.len>y.len)return 0;
			if(x.len<y.len)return 1;
			for(int i=x.len-1;i>=0;i--)
				if(x.num[i]!=y.num[i])return x.num[i]<y.num[i];
			return 0;
		}
		BigInt operator+(BigInt y){
			BigInt x=*this;
			if(x.len<y.len)swap(x,y);
			BigInt res;res.len=x.len;
			for(register int i=0;i<x.len;i++)res.num[i]=x.num[i]+y.num[i];
			for(register int i=0;i<res.len;i++)res.num[i+1]+=res.num[i]/10,res.num[i]%=10;
			while(res.num[res.len])res.num[res.len]+=res.num[res.len-1]/10,res.num[res.len-1]%=10,res.len++;
			res.len++;
			while(!res.num[res.len-1])res.len--;
			return res;
		}
		BigInt operator-(BigInt y){
			BigInt x=*this;
			BigInt res;res.len=x.len;
			for(register int i=0;i<x.len;i++)res.num[i]=x.num[i]-y.num[i];
			for(register int i=0;i<res.len;i++)
				if(res.num[i]<0)res.num[i+1]--,res.num[i]+=10;
			while(!res.num[res.len-1])res.len--;
			return res;
		}
		BigInt operator*(BigInt y){
			BigInt x=*this;
			BigInt res;res.len=x.len+y.len;
			for(register int i=0;i<x.len;i++)
				for(register int j=0;j<y.len;j++)res.num[i+j]+=x.num[i]*y.num[j];
			for(register int i=0;i<res.len;i++)res.num[i+1]+=res.num[i]/10,res.num[i]%=10;
			while(res.num[res.len])res.num[res.len]+=res.num[res.len-1]/10,res.num[res.len-1]%=10,res.len++;
			res.len++;
			while(!res.num[res.len-1])res.len--;
			return res;
		}
		BigInt operator/(int y){
			BigInt x=*this;
			BigInt res;res.len=x.len;
			int now=0;
			for(register int i=x.len-1;i>=0;i--){
				now+=x.num[i];
				res.num[i]=now/y;
				now%=y;
				now*=10;
			}
			while(!res.num[res.len-1])res.len--;
			return res;
		}
		BigInt operator/(BigInt y){
			BigInt x=*this;
			if(x<y){
				BigInt t;return t;
			}
			BigInt t;t.num[0]=1;
			BigInt l,r=x;l.num[0]=1;
			BigInt mid;
			while(l<r-t){
				mid=(l+r)/2;
				if(mid*y<x)l=mid+t;
				else r=mid;
			}
			if(x<r*y)return l;
			return r;
		}
		void setlen(int x){
			len=x;
			return;
		}
};
BigInt max(BigInt x,BigInt y){
	if(x<y)return y;
	return x;
}
struct op{
	BigInt l,r,lr;
	int rr;
}num[1005];
inline bool cmp(op x,op y){
	return x.lr<y.lr;
}
signed main(){
	int n;cin>>n;
	BigInt now;now.read();
	BigInt t;t.read();
	BigInt ans;
	for(int i=1;i<=n;i++)num[i].l.read(),num[i].r.read(),num[i].lr=num[i].l*num[i].r,num[i].rr=num[i].r.INT();
	sort(num+1,num+n+1,cmp);
	for(int i=1;i<=n;i++){
		//now.write('/');cout<<num[i].rr;putchar('=');(now/num[i].rr).write();
		ans=max(ans,now/num[i].rr);
		now=now*num[i].l;
	}
	ans.write();
	return 0;
}
2020/8/20 13:55
加载中...