统计方形(NOIP1997)
2024-08-24 22:03:22
给链接:统计方形
这题是棋盘问题的数据加强版。
其实由于洛谷的数据比较水,所以你把我在棋盘问题题解中写的代码提交,也能AC。
但让给我们来看一个更优的解法。
先给代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,m;
scanf("%d%d",&n,&m);
long long sum1=0;
for(int i=1;i<=min(n,m);i++){
sum1+=(n-i+1)*(m-i+1);
}
printf("%lld ",sum1);
long long sum2=1LL*n*(n+1)/2*1LL*m*(m+1)/2;//1
printf("%lld",sum2-sum1);
return 0;
}
其他地方没啥变化,参考我的那篇题解,这里我们只讲讲标1的这个式子,为什么这么写?
我们原来的循环是什么样的?
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
sum2+=(n-i+1)*(m-j+1);
}
}
其实这个式子写出来,也就是sum2=1*1+1*2+……+2*1+2*2+……+n*1+n*2+……+n*m,所以也就是:
sum2=(1+2+3+……+n)*(1+2+3+……+m)
利用等差数列求和公式就可得到:
sum2=(1+n)*n/2*(1+m)*m/2
注意最后还要乘1LL,防止爆int。
最新文章
- [Leetcode] Contains Duplicate III
- 一种利用 Cumulative Penalty 训练 L1 正则 Log-linear 模型的随机梯度下降法
- SPOJ 1811 Longest Common Substring
- POJ 3661 (线性DP)
- 电视直播用的.m3u8 PC端和移动端地址 【流媒体播放测试专用】
- float类型进行计算精度丢失的问题
- 使用libCurl实现断点下载
- URI和URL
- win8 VS2010 配制OpenGL
- html页面显示服务器时间
- MYSQL表记录字段换行符回车符处理
- mybatis学习日记-day01
- Swift基础之Delegate方法的使用
- 源码来袭:call、apply手写实现与应用
- java web从入门到精通
- 关键字搜索:jQuery过滤器插件fastLiveFilter||显示结果条数
- debian下如何源码安装tmux
- redis 五大数据类型之sortedset
- 清除chrome浏览器HSTS缓存
- HDU 2023 求平均成绩