计算每一条线段对答案的贡献,然后用前缀和优化就行了。。。。
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 100005;
const int mod = 1e9+7;
struct Point
{
LL x, y;
Point(LL x = 0, LL y = 0) : x(x), y(y) {}
Point operator + (const Point &b) const {
return Point((x + b.x) % mod, (y + b.y) % mod);
}
Point operator - (const Point &b) const {
return Point((x - b.x + mod) % mod, (y - b.y + mod) % mod);
}
Point operator * (const LL t) const {
return Point(x * t % mod, y * t % mod);
}
LL operator ^ (const Point &b) const {
return (x * b.y % mod - y * b.x % mod + mod) % mod;
}
}S, p[maxn];
LL two[maxn];
int n;
inline int c(int i, int j)
{
return ((i - j - 1) % n + n) % n;
}
void work()
{
scanf("%d", &n);
for(int i = 0; i < n; i++) scanf("%lld%lld", &p[i].x, &p[i].y);
S = Point(0, 0);
for(int i = 1; i < n; i++) S = S + p[i] * two[c(0, i)];
LL ans = p[0] ^ S;
for(int i = 1; i < n; i++) {
S = S - p[i] * two[c(i-1, i)];
S = S * 2LL;
S = S + p[i-1];
ans = (ans + (p[i] ^ S)) % mod;
}
printf("%lld\n", ans);
}
int main()
{
two[0] = 1;
for(int i = 1; i <= 100000; i++) two[i] = two[i-1] * 2 % mod;
int _;
scanf("%d", &_);
while(_--) work();
return 0;
}