1303 - [ 2021年绍兴市第十九届少儿信息学竞赛复赛 ] - 网格(grid) 有一个nm的网格,你需要求出网格中有多少个正方形和多少个长方形(不包括正方形)。例如:当n=2,m=3时,网格形如下图: 其中,11的正方形共有6个,22的正方形共有2个,所以正方形有8个。12的长方形有7个,13的长方形有2个,23的长方形有1个,所以长方形有10个。 由于答案可能会超出64位整数范围,你需要输出答案对1000000007( 1 0 9 10 9 +7) 取模的结果。
输入 一行两个整数n和m。
输出 一行两个整数,分别表示正方形的数量与长方形的数量对1000000007取模的结果。
样例 输入复制 2 3 输出复制 8 10 输入复制 100 75 输出复制 214700 14177800 输入复制 114514 1919810 输出复制 952234331 997363822 提示 【数据范围】 对于20%的数据,n,m<=3; 对于40%的数据,n,m<=100; 对于60%的数据,n,m<=5000; 对于80%的数据,n,m<=100000; 对于所有数据,1<=n,m<= 1 0 9 10 9 。 注意:答案需要对1000000007取模,并且模意义下不能直接进行除法运算,例如1000000008除以2的结果是500000004,1000000008对1000000007取模的结果为1,将1直接除以2并不能得到500000004。
时间限制 1 秒 内存限制 128 MB
#include <bits/stdc++.h>
using namespace std;
const long long inf=1000000007;
int main(){
long long n,m;
cin>>n>>m;
long long h1=0,h2=0;
for(int i=1;i<=min(n,m);i++){
h1=h1+(n-i+1)%inf*(m-i+1)%inf;
h1%=inf;
}
long long nn=n*(n+1)/2,mm=m*(m+1)/2;
for(int i=1;i<=m;i++){
h2=h2+(m-i+1)*((nn-n+i-1)%inf)%inf;
h2%=inf;
}
cout<<nn%inf<<" "<<mm%inf<<" ";
cout<<h1<<" "<<h2;
return 0;
}
### B:
```cpp
#include <bits/stdc++.h>
using namespace std;
const long long inf=1000000007;
int main(){
long long n,m;
cin>>n>>m;
long long s[m],dp[m];
long long h1=0,h2=0;
for(int i=1;i<=min(n,m);i++){
h1=h1+(n-i+1)%inf*(m-i+1)%inf;
h1%=inf;
}
long long nn=n*(n+1)/2,mm=m*(m+1)/2;
for(int i=1;i<=m;i++){
long long x=n-i;
if(i>n){
x=0;
}
s[i]=s[i-1]+nn-(x+1);
s[i]=s[i]%inf;
}
for(int i=1;i<=m;i++){
dp[i]=dp[i-1]+s[i];
dp[i]=dp[i]%inf;
}
cout<<h1<<" "<<dp[m];
return 0;
}
# 有没有大神指导!!!