给你两个长度均为n的数列ai和bi,定义函数
你可以改变ai内各元素的顺序,使g(n)最小,求这个最小值。由于答案很大,请输出答案对109+7取余后的值
输入描述
输入的第一行为一个整数T,代表测试用例的组数
接下来的T组测试用例按照如下格式给出:每组数据占3行,第一行有2个整数n,表示数组长度,第二行有n个整数ai,第三行有n个整数bi
输出描述
对于每组测试数据,在新的一行中输出答案,由于答案很大,请输出答案对109+7取余后的结果
数据范围
样例输入
1
2
7 17
77 77
样例输出
3696
样例解释
首先对g(x)进行分析,对于一个固定的i,f(l,i) 有 i 个,f(i,r)有n-i+1个,所以包含ai*bi 的f(l,r)有i * (n-i+1) 个。所以
for(int i = 1; i <= n; ++ i) {
g(n) += i * (n - i + 1) * ai * bi;
}
而且b[n]是固定的,所以对a进行排序,采用贪心策略即可。代码如下:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e6+1;
const int mod = 1e9+7;
long long a[maxn], b[maxn];
int main() {
int T;
scanf("%d", &T);
while(T--) {
int n;
scanf("%d", &n);
for(int i = 1; i <= n; ++ i) {
scanf("%lld", &a[i]);
}
for(int i = 1; i <= n; ++ i) {
scanf("%lld", &b[i]);
}
for(int i = 1; i <= n; ++ i) {
b[i] *= 1ll * i * (n-i+1);
}
sort(a+1, a+n+1, greater<int>());
sort(b+1, b+n+1);
long long sum = 0;
for(int i = 1; i <= n; ++ i) {
b[i] = b[i] % mod;
sum = (sum + a[i] * b[i] % mod) % mod;
}
printf("%lld\n", sum % mod);
}
return 0;
}