求助!
查看原帖
求助!
416192
kbzcz楼主2024/2/24 11:31

思路就是按 biai−1\frac{b_i}{a_i-1} 排序,如果 ans>106ans >10^6 显然直接乘更优。感觉没问题,为啥会 90pts?

bool _Start;
#include <bits/stdc++.h>
using namespace std;
#define il inline
#define Tp template<typename T>
#define Ts template<typename T,typename... _T>
Tp il void read(T& x) {
	x=0;bool f=0;char c=getchar();
	for(;!isdigit(c);c=getchar()) f|=c=='-';
	for(;isdigit(c);c=getchar()) x=(x<<1)+(x<<3)+(c^48);
	x=(f?-x:x);
}Ts il void read(T& x,_T&... y) {read(x),read(y...);}
using ll=__int128;
const int N=5e5+5,mod=1e9+7;
int n;
ll ans;
struct node {
	ll a,b;
	long double div;
}p[N];
bool _End;
int main() {
	fprintf(stderr,"Memory: %.4lf Mib\n",abs(&_End-&_Start)/1048576.0);
	read(n);
	for(int i=1;i<=n;i++) read(p[i].a);
	for(int i=1;i<=n;i++) read(p[i].b);
	ans=1;
	for(int i=1;i<=n;i++)
		if(p[i].a==1) ans+=p[i].b;
	for(int i=1;i<=n;i++)
		if(p[i].a!=1) p[i].div=p[i].b*1.0/(p[i].a-1);
	sort(p+1,p+1+n,[](node x,node y) {
		return x.div>y.div;
	});
	bool bk=0;
	for(int i=1;i<=n;i++) {
		if(p[i].a==1) continue;
		if(bk) ans=ans*p[i].a%mod;
		else {
			if(p[i].div>ans) ans=(ans+p[i].b);
			else ans=ans*p[i].a;
			if(ans>=1e6) ans%=mod,bk=1;
		}
	}
	printf("%lld\n",(long long)ans);
	return 0;
}
2024/2/24 11:31
加载中...