#4697. 格

#4697. 格题目描述题解看对题目!首先我们可以把答案看成对于被经过的格子,最后经过的是第几天的总和对于n1,m1n1,m1n1,m1的时候,如果k≥nmk\genmk≥nm,那说明你可以现在原地蹲着,等到最后的时候找一条

题目描述
题解

看对题目!

首先我们可以把答案看成对于被经过的格子,最后经过的是第几天的总和

对于 n > 1 , m > 1 n>1,m>1 n>1,m>1 的时候,如果 k ≥ n m k\ge nm knm ,那说明你可以现在原地蹲着,等到最后的时候找一条路走满这 n m nm nm 个格子,考虑到一个网格图中如果 n , m n,m n,m 都是奇数,那么对于一个格子 ( x , y ) (x,y) (x,y) ,如果 x + y x+y x+y 是偶数那它就存在哈密顿路径,所以如果一开始你在 ( x , y ) (x,y) (x,y) x + y x+y x+y是奇数的格子上的话,你可以趁第一天下午溜过去然后蹲着;如果 n , m n,m n,m 有一个是偶数,那图中存在哈密顿回路,因此答案就是 k − n m + 1 + . . . + k k-nm+1+…+k knm+1+...+k 。如果 k < n m k<nm k<nm 的话,那就直接走就好了,答案就是 1 + . . . + k 1+…+k 1+...+k

对于 n = 1 n=1 n=1 的情况,假设 v = m i n ( y , m − y + 1 ) v=min(y,m-y+1) v=min(y,my+1) 。如果 m − v + 1 ≥ k m-v+1 \ge k mv+1k 的话,那就直接走就好了,答案就是 1 + . . . + k 1+…+k 1+...+k ,如果 k ≥ m + m − v − 1 k \ge m+m-v-1 km+mv1 的话说明你可以先往小的方向走然后蹲着,等到最后再出来,否则的话你就可以先往小的方向走几步,然后再往大的方向走即可

代码
#include <bits/stdc++.h> #define LL long long using namespace std; const LL P=; int T;LL n,m,k,X,Y; LL C(LL l,LL r){ 
    return (l+r)%P*((r-l+1)%P)%P*((P+1)>>1)%P; } void work(){ 
    scanf("%lld%lld%lld%lld%lld",&n,&m,&X,&Y,&k); if (n>1 && m>1) printf("%lld\n",C(max(k-n*m,0ll)+1,k)); else{ 
    if (m==1) swap(n,m),swap(X,Y);Y=min(Y,m-Y+1); if (m-Y+1>=k) printf("%lld\n",C(1,k)); else if (k>=m+m-Y-1) printf("%lld\n",C(k-m+1,k)); else printf("%lld\n",C((k+Y-m+1)/2,k)); } } int main(){ 
    for (scanf("%d",&T);T--;work()); return 0; } 

今天的文章
#4697. 格分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/60249.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注