前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >HDU-6004-Periodical Cicadas

HDU-6004-Periodical Cicadas

作者头像
f_zyj
发布2018-01-09 10:31:31
4070
发布2018-01-09 10:31:31
举报

ACM模版

描述

描述
描述
image.png
image.png
image.png
image.png

代码

代码语言:javascript
复制
#include <iostream>
#include <algorithm>

using namespace std;

typedef long long ll;
typedef __int128 lll;

const int MAXN = 202;
const int MAXM = MAXN * MAXN / 2 + MAXN;

struct node
{
    ll a, b;
} dp[MAXN][MAXM];

int n, m, q;

inline int _hash(int x, int y)
{
    return (2 * m - x + 1) * x / 2 + y - x + 1;
}

ll exgcd(ll a, ll b, ll &x, ll &y)
{
    if (b == 0)
    {
        x = 1;
        y = 0;
        return a;
    }

    ll ans = exgcd(b, a % b, x, y);
    ll t = x;
    x = y;
    y = t - a / b * y;

    return ans;
}

node merge(node x, node y)
{
    if (x.a == -1 || y.a == -1)
    {
        return {-1, -1};
    }

    ll _x, _y;
    ll g = exgcd(x.b, y.b, _x, _y);
    if ((y.a - x.a) % g)
    {
        return {-1, -1};
    }

    ll t = (y.a - x.a) / g;
    lll p = x.a + (lll)x.b * _x * t;
    lll q = x.b / g * y.b;
    p = (p % q + q) % q;
    return {(ll)p, (ll)q};
}

void init()
{
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            for (int k = j + 1; k < m; k++)
            {
                dp[i][_hash(j, k)] = merge(dp[i][_hash(k, k)], dp[i][_hash(j, k - 1)]);
            }
        }
    }
}

int main(int argc, const char * argv[])
{
    int T;
    cin >> T;

    for (int ce = 1; ce <= T; ce++)
    {
        printf("Case #%d:\n", ce);

        scanf("%d%d", &n, &m);
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < m; j++)
            {
                scanf("%lld", &dp[i][_hash(j, j)].a);
            }
        }

        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < m; j++)
            {
                scanf("%lld", &dp[i][_hash(j, j)].b);
            }
        }

        init();

        scanf("%d", &q);

        int x1, y1, x2, y2;
        while (q--)
        {
            scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
            x1--; y1--; x2--; y2--;
            node ans = dp[x1][_hash(y1, y2)];
            for (int i = x1 + 1; i <= x2; i++)
            {
                if (ans.a == -1)
                {
                    break;
                }
                ans = merge(ans, dp[i][_hash(y1, y2)]);
            }

            printf("%lld\n", ans.a);
        }
    }

    return 0;
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017年11月19日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 描述
  • 代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档