bzoj 1004 分类: bzoj 2015-06-29 21:31 25人阅读 评论(0) 收藏
无限仰慕中。。。
看来我还并不会
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define REP(i,L,R) for(int i = L; i <= R; i++)
#define PER(i,L,R) for(int i = R; i >= L; i--)
#define CLR(x) memset(x, 0, sizeof(x))
const int size = 25, maxm = 65, maxn = maxm;
int sr, sb, sg, m, n, p;
int xp[maxn], ans;
bool hash[maxn];
int f[size][size][size];
int dp()
{
CLR(f), CLR(hash), f[0][0][0] = 1;
REP(i, 1, n) if(!hash[i])
{
int tp = i, len = 0;
while(!hash[tp])
hash[tp] = true, tp = xp[tp], len++;
PER(r, 0, sr) PER(b, 0, sb) PER(g, 0, sg)
{
if(r >= len) f[r][b][g] += f[r-len][b][g];
if(b >= len) f[r][b][g] += f[r][b-len][g];
if(g >= len) f[r][b][g] += f[r][b][g-len];
f[r][b][g] %= p;
}
}
return f[sr][sb][sg];
}
int power(int x,int y)
{
int ret = 1;
while(y)
{
if(y&1) ret *= x, ret %= p;
x *= x, x %= p, y >>= 1;
}
return ret;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("bzoj1004.in","r",stdin);
freopen("bzoj1004.out","w",stdout);
#endif
std::cin >> sr >> sb >> sg >> m >> p;
n = sr + sb + sg;
REP(i, 1, n) xp[i] = i;
ans += dp(), ans %= p;
REP(i, 1, m)
{
REP(j, 1, n) std::cin >> xp[j];
ans += dp(), ans %= p;
}
ans *= power(m + 1, p - 2), ans %= p;
std::cout << ans;
#ifndef ONLINE_JUDGE
fclose(stdin);
fclose(stdout);
#endif
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。