链接:
https://codeforces.com/problemset/problem/1358/C
题意:
一个特殊无限矩阵(看题),求从( x1 , y1 )到( x2 , y2 )有几种不同的路径和
解:
标签就一个math
只能是半猜半蒙~~(bushi)~~
首先,每一步的选择上只有右和下
选择下的话对于选择右路径和小1
观察( 1 , 1 )到( 3 , 3 )
1 2 4
3 5 8
6 9 13
有以下几条路径
- 1+2+4+8+13=28
- 1+2+5+8+13=29
- 1+2+5+9+13=30
- 1+3+5+8+13=30
- 1+3+5+9+13=31
- 1+3+6+9+13=32
一共五种不同路径和,而且最大值32和最小值28和其间所有数都存在
可以发现,最小值是先向右到底后再向下
最小值+1是在倒数第2(1+1)列先向下一次//29
最小值+2是在倒数第2(1+1)列先向下两次,或者在倒数第3(2+1)列先向下一次//30
最小值+3是在倒数第3(2+1)列先向下一次,再在倒数第2(1+1)列先向下一次//31
最小值+4是在倒数第3(2+1)列直接向下两次//32
**但是!!!**上面这点我们只要知道就行
假设最小值路径为x,在x-n的位置向下m次的路径和为x+(n-1)*m~~(大概)~~
所以最大值和最小值差为(n-1)*m,当m为( y2 - y1 )【行差】,n-1为( x2 -x1)【列差】;
可得,路径和的数量==路径和最大值-路径和最小值+1
公式:(abs(x1-x2))*(abs(y1-y2))+1
PS:如此,要证明最大值和最小值其间所有数都存在
很简单,(n-1)*m的组合满足最大值-最小值的差值,所以其间所有数都存在
实际代码:
#include<iostream>
#include<cmath>
using namespace std;
typedef long long int ll;
int main()
{
ll t;
cin>>t;
for(int f=1;f<=t;f++)
{
ll x1,y1,x2,y2;
cin>>x1>>y1>>x2>>y2;
//cout<<(x1-x2)<<" - "<<(y1-y2)<<endl;
cout<<(abs(x1-x2))*(abs(y1-y2))+1<<endl;
}
}
限制:
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output