I-永远亭的小游戏
题目:
样例输入:
2 2 2
1 2
1 1
2 4
样例输出:
500000008
思路:
纯粹暴力应该会超时,分析了下样例发现sum=c1*(b1*(a1+a2)+b2*(a1+a2))+c2*(b1*(a1+a2)+b2*(a1+a2)),得出规律:sum=c1*(b1*(a1+a2+…+an)+b2*(a1+a2…+an)+…+bn*(a1+a2…+an))+c2*(b1*(a1+a2+…+an)+b2*(a1+a2…+an)+…+bn*(a1+a2…+an))+…+cn*(b1*(a1+a2+…+an)+b2*(a1+a2…+an)+…+bn*(a1+a2…+an)),这是期望上半部分,下半部分就是nmk;
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll Mod=1e9+7;
map<ll,ll>mapp;
ll qkpow(ll a,ll p,ll mod)
{
ll t=1,tt=a%mod;
while(p)
{
if(p&1)t=t*tt%mod;
tt=tt*tt%mod;
p>>=1;
}
return t;
}
ll getInv(ll a,ll mod)
{
return qkpow(a,mod-2,mod);
}
int main(){
int n,m,k;
ll ans=0;
scanf("%d %d %d",&n,&m,&k);
for(int i=1;i<=n;i++){
ll b;
scanf("%lld",&b);
ans=ans+b;
}
ll anss=0;
for(int i=1;i<=m;i++){
ll b;
scanf("%lld",&b);
anss=(anss+(ans*b)%Mod)%Mod;
}
ll ansss=0;
for(int i=1;i<=k;i++){
ll b;
scanf("%lld",&b);
ansss=(ansss+(b*anss)%Mod)%Mod;
}
ansss=ansss*getInv(n*m%Mod*k%Mod,Mod)%Mod;
printf("%lld",ansss);
}