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