湖南省第十八届大学生计算机程序设计竞赛(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)),其他的我就不列举了,以上是不是发现有规律了。
以下的图是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;
}
本人蒟蒻,如有错误或者不恰当的地方还望指正,感谢观看我的博客
标签:Matrix,Big,sum,long,b1,b2,ll,lld From: https://www.cnblogs.com/expect-999/p/17612865.html