D :Big Matrix

发布时间 2023-08-07 22:09:18作者: 只会做红色题

湖南省第十八届大学生计算机程序设计竞赛(HNCPC2022)D题

原题链接:https://cpc.csgrandeur.cn/csgoj/problemset/problem?pid=1192

关于这题其实是一道数学题,如果直接暴力三重循环肯定爆T,所以细心一点的就会发现,其实有规律

首先题目意思如下

规律如下,自己可以尝试一下列举后面的A(i,j),并且画个图就会明白其规律。
例如n等于2时,A(0,0)[B(0,0)+B(0,1)+B(0,2)],A(0,1)[B(1,0)+B(1,1)+B(1,2)],其他的我就不列举了,以上是不是发现有规律了。
以下的图是n等于1时,A(0,0)*[B(0,0)+B(0,1)],有等差数列的性质,我就不啰嗦了

代码如下

#include<bits/stdc++.h>

using namespace std;

typedef long long ll;

const int mod = 1e9 + 7;

int  main()
{
    ll  n, a1, a2, b1, b2; //为了防溢出,变量全定义long long类型

    while (scanf("%lld %lld %lld %lld %lld", &n, &a1, &a2, &b1, &b2) != EOF)
    {
        ll sum = 0;

        ll cnt = (n - 1) * n / 2;

        for (ll i = 0; i < n; i++) 
        {
            for (ll j = 0; j < n; j++) 
            {
               ll q = i * a1 + j * a2; //这里是求A(i,j),枚举每一个A(i,j)
               sum = (sum + q * (j * b1 * n + cnt * b2)) % mod;
             //由规律可求出每一个数A(i,j)对应乘以第二个方阵的和
            }
        }
        printf("%lld\n",sum);
    }
    return 0;
}

本人蒟蒻,如有错误或者不恰当的地方还望指正,感谢观看我的博客