学长推荐的。。。。。。
看了Ratio首先赞扬一下自己的勇气。。(汗
怎么说呢,其实应该一眼看出来的。2000*2000的数据规模,求一共有多少种方案。应该很明显是n^2的DP。
方程怎么写呢。
开始是想到,可以省略掉中间过程,直接看某个数在M次操作后的位置。但是写不出方程来。思路不够清晰条理吧。
好吧。既然是n^2的DP那么就不管三七二十一,一上来直接dp[i][j]表示前i个数j次操作后的方案数。
自己想的是,dp[i][j] = dp[i-1][j]+dp[i-1][j-1]。也就是说要么是前i-1个数自己操作j次不跟第i个扯上关系,要么是i-1个数j-1次操作了之后第i-1个数再跟第i个换。好吧。我以为前i-2个数都不能和i换了。因为一步之内不能完成。但是可以多步啊!!我去。所以说就变成
dp[i][j] = ∑dp[i-1][j-k].其中1<=k<= j。
但是要注意,如果j>=i 了怎么办呢?我们想,对于n个数,只会有0-n-1的可能性。这个看上去像不像求余?所以说其实dp[i][j]如果j>=i实际上也就是可以modM映射到某个数上去。所以就ans-=dp[i-1][j-i]。由于dp[i-1][j-i]==dp[i-1][j-2*i]的。所以说这步就相当于更相损减术实现的求余。
最后注意一下对于求模的运算。
#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <stack>
#include <bitset><