HDOJ 5448 Marisa’s Cake

来源:互联网 发布:linux文件夹 编辑:程序博客网 时间:2024/05/18 15:27

计算每一条线段对答案的贡献,然后用前缀和优化就行了。。。。

#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;}


0 0
原创粉丝点击