Description

给定一块 \(n \times m (n,m \le 10^{18})\) 的网格形巧克力,初态下连通,每次可以吃掉某一个连通块上的一行或一列,这可能导致这个连通块段成两个连通块。求吃完的最大步数。

Solution

\(f(x,y)\) 表示对于 \(x \times y\) 的巧克力的答案,由于对称性,不妨设 \(x \le y\),则很显然有

\[f(x,y)=\max(f(x,j)+f(x,y-j-1))+1 \]

\(f(1,y),f(2,y),...,f(x,y)\) 找规律容易得到

\[f(x,y)=\frac {xy+x+y-1}{2} \]

#include <bits/stdc++.h>
using namespace std;

#define int long long 
#define lint __int128_t
const int N = 100005;
const int mod = 1e9+7;
const int dbg = 1;

signed main()
{
    int x,y;
    cin>>x>>y;
    lint ans=((lint)x*y+x+y-1)/2;
    cout<<(int)(ans%mod)<<endl;
    if(dbg) system("pause");
}

相关文章: