【CF1027E】Inverse Coloring(DP)

题意:给出一个n*n的矩阵,要求在每个位置涂上黑/白色,

要求满足:任意相邻的两行,其颜色要么完全相同,要么完全相反

任意相邻的两列,其颜色也要么相同要么完全相反

且这个矩形中,不存在任意一个大小大于等于k的同色矩形

求方案数模998244353

n<=5e2,1<=k<=n^2

思路:From https://blog.csdn.net/qq_34454069/article/details/81835687

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<string>
 4 #include<cmath>
 5 #include<iostream>
 6 #include<algorithm>
 7 #include<map>
 8 #include<set>
 9 #include<queue>
10 #include<vector>
11 #include<bitset>
12 using namespace std;
13 typedef long long ll;
14 typedef unsigned int uint;
15 typedef unsigned long long ull;
16 typedef pair<int,int> PII;
17 typedef vector<int> VI;
18 #define fi first
19 #define se second 
20 #define MP make_pair
21 #define N      510
22 #define M      51
23 #define MOD 998244353
24 #define eps 1e-8 
25 #define pi     acos(-1)
26 #define oo     1e9
27 
28 int dp[N][N],f[N];
29 
30 void add(int &x,int y)
31 {
32     x=(ll)x+y;
33     if(x>=MOD) x-=MOD;
34 }
35 
36 int main()
37 {
38     int n,K;
39     scanf("%d%d",&n,&K);
40     for(int i=1;i<=n;i++)
41     {
42         dp[0][i]=1;
43         for(int j=1;j<=n;j++)
44          for(int k=1;k<=min(i,j);k++) add(dp[j][i],dp[j-k][i]);
45     }
46     for(int i=1;i<=n;i++) f[i]=(dp[n][i]-dp[n][i-1]+MOD)%MOD; 
47     int ans=0;
48     for(int i=1;i<=n;i++)
49      for(int j=1;j<=n;j++)
50       if(i*j<K) add(ans,(ll)f[i]*f[j]%MOD); 
51     ans=ans*2%MOD;
52     printf("%d\n",ans);
53     return 0;
54 }

 

posted on 2018-12-12 14:15  myx12345  阅读(231)  评论(0编辑  收藏  举报

导航