首页 > 其他分享 >题解 小 a 和 uim 之大逃离

题解 小 a 和 uim 之大逃离

时间:2023-10-02 10:22:40浏览次数:38  
标签:原点 题解 LL uim long 逃离 getchar

题目链接

首先可以想到设状态 \(k_1,k_2\) 表示小 \(a\) 和小 \(uim\) 分别表示他们目前取得的得分,那么最终的答案便是 \(k_1=k_2\) 的时候。

但是这样设置状态的复杂度无疑是高的。并且十分浪费,所以考虑设 \(z\) 表示 \(k_1-k_2\) 的值。那么 \(z=0\) 就是答案。

接着考虑如何处理任意起点出发,根据套路,可以设置一个超级原点,向每个点进行连边,跑 \(dp\) 即可。

设 \(f_{x,y,z,0/1}\) 表示从超级原点到 \((x,y)\),差值为 \(z\),且现在是 小\(a\)/小\(uim\) 拿分,答案就是 \(\sum_{i=1,j=1}^{n,m} f_{i,j,0,1}\)。将超级原点设为 \((0,0)\) 即可,为了使得第一步是小 \(a\) 取,我们将边界条件设为 \(f_{0,0,0,1}=1\)。

\[f_{x,y,z,0}=f_{x-1,y,z-a_{x,y},1}+f_{x,y-1,z-a_{x,y},1}+f_{0,0,z-a_{x,y},1}\\ f_{x,y,z,1}=f_{x-1,y,z+a_{x,y},0}+f_{x,y-1,z+a_{x,y},0}+f_{0,0,z+a_{x,y},0}\\ \]

由于两人得分要 \(\%\;(k+1)\),所以我们将 \(z\) 转化为模意义下的即可。

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

typedef long long LL;
LL read() {
	LL sum=0,flag=1; char c=getchar();
	while(c<'0'||c>'9') {if(c=='-') flag=-1; c=getchar();}
	while(c>='0'&&c<='9') {sum=sum*10+c-'0'; c=getchar();}
	return sum*flag;
}

const LL MOD=1e9+7;
const int N=810;
int n,m,k;
int f[N][N][20][2],a[N][N];

int To(int x) {
	return (x%(k+1)+(k+1))%(k+1);
}

int main() {
	cin>>n>>m>>k;
	for(int i=1;i<=n;i++) {
		for(int j=1;j<=m;j++) {
			a[i][j]=read();
		}
	}
	f[0][0][0][1]=1;
	for(int i=1;i<=n;i++) {
		for(int j=1;j<=m;j++){
			for(int z=0;z<=k;z++) {
				f[i][j][z][1]=((f[i-1][j][To(z+a[i][j])][0]+f[i][j-1][To(z+a[i][j])][0])%MOD+f[0][0][To(z+a[i][j])][0])%MOD;
				f[i][j][z][0]=((f[i-1][j][To(z-a[i][j])][1]+f[i][j-1][To(z-a[i][j])][1])%MOD+f[0][0][To(z-a[i][j])][1])%MOD;
			}
		}
	}
	LL ans=0;
	for(int i=1;i<=n;i++) {
		for(int j=1;j<=m;j++) {
			ans=(ans+f[i][j][0][1])%MOD;
		}
	}
	cout<<ans;
	return 0;
}

标签:原点,题解,LL,uim,long,逃离,getchar
From: https://www.cnblogs.com/zhangyuzhe/p/17739734.html

相关文章

  • SP9494 ZSUM - Just Add It 题解
    题目传送门前置知识快速幂解法推式子:\(\begin{aligned}Z_n+Z_{n-1}-2Z_{n-2}&=(Z_n-Z_{n-2})+(Z_{n-1}-Z_{n-2})\\&=(S_n+Q_n-S_{n-2}-Q_{n-2})+(S_{n-1}+Q_{n-1}-S_{n-2}-Q_{n-2})\\&=((n-1)^k+n^k+(n-1)^{n-1}+n^n)+((n-1)^k+(n-1)^{n-1})\\&=n^n+n^k+......
  • P2951 [USACO09OPEN] Hide and Seek S 题解
    Problem题目概述给你一个无向图,边权都为\(1\),求:离\(1\)号点最远的点的编号、最远的距离、有几个点是离\(1\)号点最远的。思路直接用:优先队列\(BFS\),先求出\(1\)号点到每个点的最短路,存到\(dis\)数组中,然后再求\(max(dis[i])\),就搞定了。错误原因审题&做法错......
  • P1144 最短路计数 题解
    Problem考察算法:拓扑排序+\(DP\)+\(Dijkstra\)。题目简述给出一个无向无权图,问从顶点\(1\)开始,到其他每个点的最短路有几条。思路先求出\(1\)号点到每个点的最短路\(d_i\)。分析每条边$(x,y)$:如果d[x]+1==d[y]:这条边有用。将所有有用的边拓扑排序......
  • [POI2003] Monkeys 题解
    [POI2003]Monkeys题解正着做貌似不好做,发现猴子是否掉落取决于“最后一根稻草”,也就是最后撒手的那个猴子,那我们考虑倒着把猴子网拼回去。这样,每群猴子掉落的时刻就是与\(1\)号猴子连通的时刻。利用并查集可以维护猴子的连通性,但是怎么更新答案呢?这里用vector进行了一个猴......
  • CF1874C Jellyfish and EVA 题解
    题意给定一个有向无环图,对于任意一条边\((u_i,v_i)\),有\(u_i<v_i\)。定义一次从节点\(u\)开始的移动为如下过程:\(\tt{Alice}\)选择从\(u\)出发的且未被删除的一条边。\(\tt{Bob}\)在从\(u\)出发的且未被删除的边中等概率随机选择一条。若两人选择的边相同......
  • P1126 机器人搬重物 题解
    Problem题目概括$n\timesm$的网格,有些格子是障碍格。\(0\)无障碍,\(1\)有障碍。机器人有体积,总是在格点上。有5种操作:向前移动\(1/2/3\)步左转\(/\)右转每次操作需要\(1\)秒。求从\(x_1,y_1\)到\(x_2,y_2\)点的最短路。机器人有一个初始方向$......
  • P1182 数列分段 Section II 题解
    Problem考察知识点:二分、贪心。题目描述对于给定的一个数组,现要将其分成\(M\)段,并要求每段连续,且每段和的最大值最小。思路二分答案出每段和最大值的最小值,然后贪心检验是否满足。难点在\(check\)上。策略:每次开始循环,如果没有超范围,就一直选,知道选满为止,求最大值。代......
  • Codeforces 1278D 题解
    题目大意题目大意给你\(n\)(\(1\leqslantn\leqslant5\cdot10^5\))条线段\([l_1,r_1],[l_2,r_2],\cdots,[l_n,r_n]\)(\(1\lel_i<r_i\le2n\))。保证每条线段的端点为整数,且\(\foralli,j\)(\(i\nej\)),不存在\(l_i=l_j\)或\(r_i=r_j\),不存......
  • P5943 [POI2002] 最大的园地 题解
    题目传送门前置知识单调栈简化题意在一个\(n\timesn\)的正方形内找到最大的由\(0\)组成的子矩形的面积。解法令\(f_{i,j}(1\lei,j\len)\)表示从\((1,j)\)到\((i,j)\)中以\((i,j)\)结尾的均为\(0\)的子串长度,即\((i,j)\)上面可延伸的最大距离(子矩形的......
  • Codeforces 1702G2 题解
    题目大意给出一个大小为\(n\)的树,\(q\)次询问,每次给出一个大小为\(m\)的点集,判断是否有一条链覆盖这些点(这条链可以经过其他点)。\(n,\summ\leqslant2\cdot10^5\),\(q\leqslant10^5\)。提示提示1思考将$m$个点按深度排序。题解题解考虑将\(m\)个点按树......