bzoj 1004 分类: bzoj 2015-06-29 21:31 25人阅读 评论(0) 收藏


大神的题解


无限仰慕中。。。

看来我还并不会 polya 定理。


#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;               
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

posted @ 2015-06-29 21:31  <Dash>  阅读(120)  评论(0编辑  收藏  举报