Skip to content

14259: 【原4259】循环语句

题目

题目描述

author: 于峥 原OJ链接:https://acm.sjtu.edu.cn/OnlineJudge-old/problem/4259

问题描述

翁阿姨在程序设计课上教了大家循环语句,现在有这样一份程序:

#include <cstdio>
using namespace std;
int main() {
    int n, m, i, j, k, l, x, y, tmp = 0;
    scanf("%d%d", &n, &m);
    for (i = 1; i <= n; ++i)
        for (j = 1; j <= m; ++j)
            for (k = i; k <= n ; ++k)
                for (l = j; l <= m; ++l)
                    for (x = i; x <= k; ++x)
                        for(y = j; y <= l; ++y) ++tmp;
    printf("%d\n", tmp);
}

问最后输出的结果是多少。

输入格式

一共两个整数 $n$ 和$m$。

输出格式

一个整数tmp, 为了方便,对 $10^9 +7$取模后输出。

样例输入

167 198

样例输出

906462341

数据规模

对于 $20\%$的数据, $n, m \leq 40$。

对于 $40\%$的数据, $n, m \leq 150$。

对于 $60\%$的数据, $n, m \leq 3000$。

对于 $80\%$的数据, $n, m \leq 10^7$。

对于 $100\%$的数据, $n, m \leq 10^{18}$。

satgo1546's solution

#include <stdio.h>
#define x 1000000007ULL

int main(int argc, char *argv[]) {
    // n × (n + 1) × (n + 2) × m × (m + 1) × (m + 2) ∕ 36
    unsigned long long a, b, c, d, e, f;
    scanf("%llu%llu", &a, &d);
    b = a + 1;
    c = a + 2;
    e = d + 1;
    f = d + 2;
    if (a % 3 == 0) a /= 3; else if (b % 3 == 0) b /= 3; else c /= 3;
    if (d % 3 == 0) d /= 3; else if (e % 3 == 0) e /= 3; else f /= 3;
    if (a % 2 == 0) a /= 2; else b /= 2;
    if (d % 2 == 0) d /= 2; else e /= 2;
    a %= x;
    b %= x;
    c %= x;
    d %= x;
    e %= x;
    f %= x;
    a *= b; a %= x;
    a *= c; a %= x;
    a *= d; a %= x;
    a *= e; a %= x;
    a *= f; a %= x;
    printf("%llu\n", a);
    return 0;
}