多边形染色
多边形染色
#include<bits/stdc++.h>
#define int long long
#define ld double
#define con putchar_unlocked(' ')
#define ent putchar_unlocked('\n')
#define Blue_Archive return 0
using namespace std;
constexpr int N = 6e4 + 7; // ?,为啥要开到 6e4 才能过。。。?
constexpr int mod = 987654321;
constexpr int INF = 1e18;
constexpr char me[] = "終末なにしてますか?忙しいですか?救ってもらっていいですか?";
int n;
int m;
int c;
int ans;
int dp[N][15];
bool vis[N];
bitset<15> del[N];
inline int read()
{
int k = 0,f = 1;
char c = getchar_unlocked();
while(c < '0' || c > '9')
{
if(c == '-') f = -1;
c = getchar_unlocked();
}
while(c >= '0' && c <= '9') k = (k << 3) + (k << 1) + c - '0',c = getchar_unlocked();
return k * f;
}
inline void write(int x)
{
if(x < 0) putchar_unlocked('-'),x = -x;
if(x > 9) write(x / 10);
putchar_unlocked(x % 10 + '0');
}
signed main()
{
// freopen("data.in","r",stdin);freopen("data.out","w",stdout);
n = read();
m = read();
c = read();
for(int i = 1,op,x,y;i <= m;i ++)
{
op = read();
x = read();
y = read();
if(op == 1)
{
for(int j = 1;j <= c;j ++)
{
if(j == y) continue;
del[x][j] = 1;
}
}
if(op == 2) del[x][y] = 1; // 删掉这个点
if(op == 3)
{
if(x > y) swap(x,y);
vis[y] = 1;
}
}
for(int p = 1;p <= c;p ++)
{
if(del[1][p]) continue;
memset(dp,0,sizeof(dp));
dp[1][p] = 1;
for(int i = 2;i <= n;i ++)
{
if(vis[i])
{
for(int j = 1;j <= c;j ++) if(!del[i][j]) dp[i][j] = dp[i - 1][j];
continue;
}
for(int j = 1;j <= c;j ++)
{
for(int k = 1;k <= c;k ++)
{
if(j == k || del[i][j] || (i == n && j == p)) continue;
dp[i][j] = (dp[i][j] + dp[i - 1][k]) % mod;
}
}
}
for(int i = 1;i <= c;i ++) ans = (ans + dp[n][i]) % mod;
}
write(ans);ent;
Blue_Archive;
}
与你的日常,便是奇迹

浙公网安备 33010602011771号