求救(在线等,很急)
  • 板块灌水区
  • 楼主Tzh2012
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/8/22 18:44
  • 上次更新2024/8/22 21:06:59
查看原帖
求救(在线等,很急)
1331199
Tzh2012楼主2024/8/22 18:44

题目:

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

我的代码:

A:

#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;
}

# 有没有大神指导!!!
2024/8/22 18:44
加载中...