题目
是一道水题,之所以特意写出来,是因为觉得取模(也就是模数的性质)真得值得注意。最开始交的一发,是缺少在for循环里取模。不经让菜鸡想起遥远的杭电新生赛,那是第一次接触到反复取模的题目,写了两个多小时,靠自己推数学公式推出来的模数的一点性质。有空做一个关于取模的题型和知识小结。用这道题目提醒自己。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define T int T; scanf("%d", &T); while(T--)
const ll mod=1e9+7;
int main()
{
int n, a;
ll ans1=0, ans2=0;//ans1小, ans2大
scanf("%d", &n);
vector<int> v1, v2;
for(int i=0; i<n; i++){
scanf("%d", &a);
if(a>=0)
v1.push_back(a);
else
v2.push_back(a);
}
sort(v1.begin(), v1.end());
sort(v2.begin(), v2.end());
int l1=(int)v1.size();
int l2=(int)v2.size();
if(l1 && !l2){
for(int i=1; i<l1; i++){
ans1+=v1[0]*v1[i];
ans1=(mod+ans1)%mod;
}
for(int i=0; i<l1-1; i++){
ans2+=v1[i]*v1[l1-1];
ans2=(mod+ans2)%mod;
}
}
if(l2 && !l1){
for(int i=0; i<l2-1; i++){
ans1+=v2[i]*v2[l2-1];
ans1=(mod+ans1)%mod;
}
for(int i=1; i<l2; i++){
ans2+=v2[0]*v2[i];
ans2=(mod+ans2)%mod;
}
}
if(l1 && l2){
for(int i=0; i<l1; i++){
ans1+=v2[0]*v1[i];
ans1=(mod+ans1)%mod;
}
for(int i=1; i<l2; i++){
ans1+=v1[l1-1]*v2[i];
ans1=(mod+ans1)%mod;
}
for(int i=0; i<l1-1; i++){
ans2+=v1[l1-1]*v1[i];
ans2=(mod+ans2)%mod;
}
for(int i=1; i<l2; i++){
ans2+=v2[0]*v2[i];
ans2=(mod+ans2)%mod;
}
ans2+=v1[0]*v2[l2-1];
ans2=(mod+ans2)%mod;
}
ans1=(mod+ans1)%mod;
ans2=(mod+ans2)%mod;
printf("%lld %lld\n", ans1, ans2);
return 0;
}