lg8365题解

容易发现我们一定会先加后乘,使用调整法可以证明这个结论。
并且可以发现除了ai值为1的数外(假设他们的a值和为s),其他的数最多只会选1个做加法操作(设如果其他的数都不做加法操作,答案为ans)。并且所有ai=1的数都会用加法。使用反证法可以证明
考虑枚举选择的做加法操作的数i。那么答案为ans(bi+s)ai
事实上我们需要找到最大的(bi+s)ai。使用分数类(维护二元组(a,b)表示aba,b要开long long)即可。

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define mo 1000000007
#define N 1000010
int n,a[N],b[N];
int pw(int x,int y){
	int z=1;
	while(y){
		if(y&1)
			z=z*x%mo;
		x=x*x%mo;
		y>>=1;
	}
	return z;
}
signed main(){
	scanf("%lld",&n);
	for(int i=1;i<=n;i++)
		scanf("%lld",&a[i]);
	for(int i=1;i<=n;i++)
		scanf("%lld",&b[i]);
	int ans=1,v1,v2=1,av,s=1;
	for(int i=1;i<=n;i++){
		if(a[i]==1)
			s+=b[i];
		ans=ans*a[i]%mo;
	}
	av=ans*(s%mo)%mo;
	v1=s;
	for(int i=1;i<=n;i++){
		int va=(ans*pw(a[i],mo-2)%mo*(b[i]+s)%mo)%mo;
		if(a[i]!=1&&(b[i]+s)*v2>a[i]*v1){
			v1=b[i]+s;
			v2=a[i];
			av=va;
		}
	}
	printf("%lld\n",av);
}
posted @   celerity1  阅读(17)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
历史上的今天:
2021-02-14 水晶
2021-02-14 醉醺醺的幻想乡
点击右上角即可分享
微信分享提示