题意:给出一个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 ",ans); 53 return 0; 54 }