对于n*m网格

取min(n,m)作为最大的正方形边长

则答案可以表示成

s=1~min(n,m)

对于一个s*s的正方形

用oblq数组储存有多少四个角都在这个正方形边上的正方形

以4*4为例

除了4*4自身外,四个角在边上的正方形还有

所以4*4网格最多可以有4种正方形存在

推出s*s网格最多可以有s种正方形存在

单看这些正方形在网格上侧的点所在位置

可以发现这种“斜正方形”共有s-1种情况

且每个正方形的边长为

因为S=c^2

所以每个正方形面积为

取和,加上原本的面积s*s,存放在oblq[s]内便于引用

然后考虑组合情况

对于一个n*m的网格,里面可以组合出(n-s+1)*(m-s+1)种s*s的正方形

所以每次数量加上(n-s+1)*(m-s+1)*s

面积加上(n-s+1)*(m-s+1)*oblq[s]

取和即可得到答案

代码多加了个t变量,每次让n和m递减,t递增,意义不变

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=;
ll oblq[];
int main(){
ios::sync_with_stdio();
cin.tie();cout.tie();
ll T,n,m,i,j,t,N,S;
for(i=;i<=;i++){
oblq[i]=i*i;
for(j=;j<i;j++)
oblq[i]+=j*j+(i-j)*(i-j);
oblq[i]%=mod;
}
cin>>T;
while(T--){
cin>>n>>m;
N=S=;
t=;
while(n&&m){
N=(N+n*m*t)%mod;
S=(S+n*m*oblq[t])%mod;
n--;
m--;
t++;
}
cout<<N<<' '<<S<<endl;
} return ;
}

最新文章

  1. mac系统terminal连接linux
  2. 19.在HTTP 1.0中,状态码401的含义是(?);如果返回“找不到文件”的提示,则可用 header 函数,其语句为(?)写出http常见的状态码和含义,至少5个.[完善题目]
  3. Android 文字自动滚动(跑马灯)效果的两种实现方法[特别好使]
  4. 利用Visual GDB在Visual Studio中进行Android开发
  5. webform简单控件
  6. saltstack之(二)软件包下载安装
  7. Browser GetImage
  8. NODE编程(四)--构建Node Web程序2
  9. 基于Selenium2与Python自动化测试环境搭建
  10. Wordpress解析系列之PHP编写hook钩子原理简单实例
  11. java常用字节流
  12. Oracle表空间的创建与删除
  13. ubuntu1604使用之旅——Qt交叉编译移植
  14. android 7.0 调用系统相机崩溃的解决方案(非谷歌官方推荐)
  15. Oracle DB 使用RMAN恢复目录
  16. 压测工具之JMeter之环境配置及运行
  17. PYTHON语言书库
  18. EntityFramework系列:SQLite的CodeFrist和RowVersion
  19. (转)NGUI系列教程七(序列帧动画UITexture 和 UIsprit)
  20. Codeforces Round #453 (Div. 1)

热门文章

  1. 实验吧-密码学-Decode、困在栅栏里的凯撒
  2. ES6模块化深入 debug
  3. 使用jdbc连接oracle
  4. PHP的操作符与控制结构
  5. typeof()与Object.prototype.toString.call()
  6. Android自定义View——仿滴滴出行十大司机评选活动说明
  7. C#构造函数调用其他构造函数
  8. 渗透测试 - HPP数据污染 - 原理 | 场景
  9. zabbix监控一个机器上的多个java进程的jvm
  10. k8常用操作