牛客练习赛80
比赛地址:https://ac.nowcoder.com/acm/contest/11170/B
题目大意:
给出数列a和b按照公式求出c序列即可,说一下mex,比如s是一个集合,那么mexs的值就等于集合s中未出现的最小自然数。
思路:当mex{j,k}=i中的i等于0的时候显然j和k可以取任意的大于0的自然数,那么c0=(a1+a2+…+an-1)(b1+b2+…+bn-1)
当mex{j,k}=i中i等于1的时候,则aj或bk中必须有一个的下标为0,简单分析一下可以得出c1=a0(b2+b3+…+bn-1)+b0*(a2+a3+…+an-1)+a0b0
当i>=2的时候ci=a0b1+a1*b0
看代码:
#include <iostream>
typedef long long ll;
const int mod=998244353;
using namespace std;
int a[300005],b[300005];
int main()
{
int n;
cin>>n;
ll x=0,y=0,z=0,suma=0,sumb=0;
for(int i=0; i<n; i++)
{
cin>>a[i];
}
for(int i=0; i<n; i++)
{
cin>>b[i];
}
for(int i=1;i<n;i++)
{
suma=(suma+a[i])%mod;
sumb=(sumb+b[i])%mod;
}
x=1ll*suma*sumb%mod;
y=(1ll*(suma-a[1])*b[0]+1ll*(sumb-b[1])*a[0]+1ll*a[0]*b[0])%mod;
y=(y+mod)%mod;
z=(1ll*a[0]*b[1]+1ll*a[1]*b[0])%mod;
cout<<x%mod<<' '<<y%mod<<' '<<z%mod<<' ';
for(int i=3; i<n; i++)
{
cout<<0;
if(i!=n-1)
cout<<' ';
}
return 0;
}