
思路:
是道原题。可以直接拆出来变成 a [ i ] ∗ b [ i ] ∗ i ∗ ( n − i + 1 ) a[i]*b[i]*i*(n-i+1) a[i]∗b[i]∗i∗(n−i+1),
b [ i ] ∗ i ∗ ( n − i + 1 ) b[i]*i*(n-i+1) b[i]∗i∗(n−i+1)是固定的,所以再结合 a [ i ] a[i] a[i]乘起来即可。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>using namespace std;typedef long long ll;
const int maxn = 4e5 + 7;
const int mod = 1e9 + 7;
ll a[maxn],b[maxn];int cmp(ll x,ll y) {return x > y;
}int main() {int T;scanf("%d",&T);while(T--) {ll n;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]);}ll ans = 0;for(ll i = 1;i <= n;i++) {b[i] = b[i] * i * (n - i + 1);}sort(a + 1,a + 1 + n,cmp);sort(b + 1,b + 1 + n);for(int i = 1;i <= n;i++) {ans = (ans + b[i] % mod * a[i] % mod) %mod;ans %= mod;}printf("%lld\n",ans);}return 0;
}