LOJ 6464 萌萌的RQ

SOL:

  我们可以对于 x,y的奇偶性进行讨论。

  我们注意到,当x=3的时候,无论y是什么,最优策略肯定是先吃x=2这一行,剩下的一个一个吃。

  发现当x为奇数时,都可以采取这样的策略,达到最优解。

  记f[x][y]为x行y列的矩形的答案。

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

  不妨令x<y,

   有 f[1][y]=y,f[2][y]=2y-(y+1)/2 ,f[3][y]=2*y+1 ,

   数归发现f[n][y]<=ny/2+(n-1)/2 (等号在n=2k+1时取到)

       

#include<bits/stdc++.h>
#define mo 1000000007
using namespace std;
long long Mo(__int128 x,__int128 y){
    __int128 anw=x*y-(x-1)*(y-1)/2;
    return anw%mo;
}
long long sao(long long x,long long y){
//    cerr<<x<<' '<<y<<endl;
    if (x==0||y==0) return 0;    
    if (x>y) swap(x,y);
    if ((x&1)||(y&1)) 
     return Mo(x,y);
    return (sao(x,y>>1)+sao(x,(y>>1)-1)+1)%mo;
}
long long x,y;
signed main () {
    scanf("%lld%lld",&x,&y);
    printf("%lld",sao(x,y));
}

 

       

posted @ 2018-07-15 14:48  泪寒之雪  阅读(271)  评论(0编辑  收藏  举报