如果除数是一个可以表示的数就好解决了,可以直接将之前运算结果存储在一个long long类型的数组里面,数组的每一位里面都是一位(只不过是有点占用空间,但是效果也是明显的好)
另外注意题目中说了,一定会有金币,所以输出至少为1.
#include <bits/stdc++.h>
using namespace std;
const int maxn=10005;
#define ll long long
struct Node{
int a,b;
ll pro;
bool operator<(Node a)const{
return this->pro < a.pro;
}
}node[maxn];
ll a[100000];
void cal(int t)//将one乘上all,记录在all里面//第一位里面存的是长度
{
int i,len=a[0];
for(i=1;i<=len;i++)
a[i]*=t;
for(i=1;i<=len;i++){
if(a[i]>9){
a[i+1]+=a[i]/10;
a[i]=a[i]%10;
}
}
while(a[i]){
if(a[i]>9){
a[i+1]+=a[i]/10;
a[i]=a[i]%10;
}
i++;
}
a[0]=i-1;
}
void chu(int t)
{
int i;
int len=a[0];
for(i=a[0]+1;i>0;i--){
a[i-1]+=(a[i]%t)*10;
a[i]=a[i]/t;
}
while(0==a[len]) len--;
a[0]=len;
}
int main()
{
int n,i,j;
ll g_a,g_b;
cin>>n;
cin>>g_a>>g_b;
cal(1);
a[0]=1,a[1]=g_a;
for(i=0;i<n;i++){
scanf("%d %d",&node[i].a,&node[i].b);
node[i].pro=node[i].a*node[i].b;
}
sort(node,node+n);
int temp;
for(i=0;i<n-1;i++){
temp=node[i].a;
cal(temp);
}
chu(node[n-1].b);
for(i=a[0];i>0;i--){
printf("%lld",a[i]);
}
if(0==a[0]) printf("1");//所有的大臣都会获得一定的金币
printf("\n");
return 0;
}