我在赛时写下了如下代码,你也来试试吧
#include<iostream>
#include<vector>
#include<algorithm>
#include<climits>
using namespace std;
#define getc getchar_unlocked
#define putc putchar_unlocked
#define ed cout<<'\n'
#define F(i,a,b) for(int i=a;i<=b;i++)
#define G(i,a,b) for(int i=a;i>=b;i--)
#define int long long
int read(){
int f = 1 , k = 0;
char c = getc();
while(c < '0' or c > '9'){if(c == '-')f = -1;c = getc();}
while(c >= '0' and c <= '9')k = (k << 3) + (k << 1) + c - 48 , c = getc();
return f * k;
}
void write(int x){
if(x < 0)putc('-'),x = -x;
if(x < 10)putc(x + '0');
else write(x / 10),putc(x % 10 + '0');
}
const int mod = 998244353, N = 1000;
int n, k, ans, s[N];
namespace SubTask1{
void check(int k){
int f = 0;
for(int i = 0; i + k - 1 < n; ++i){
int res = 0;
for(int j = 1; j <= k; ++j){
if(s[i + k - j] == 1)res |= (1 << (j - 1));
}
if(!s[res])f |= 1;
}
ans += !f;
// if(!f){
// for(int i = 0; i < n; ++i)cout << s[i] << ' ';
// cout << '\n';
// }
if(ans > mod)ans -= mod;
}
inline void solve(int cnt, int k){
if(cnt == n)return check(k), void();
s[cnt] = 1;
solve(cnt + 1, k);
s[cnt] = 0;
solve(cnt + 1, k);
}
void Main(int n, int k){
solve(0, k);
cout << ans << '\n';
ans = 0;
}
}
namespace SubTask2{
int qpow(int a, int b){
int res = 1;
while(b){
if(b & 1)res = res * a % mod;
a = a * a % mod;
b >>= 1;
}
return res;
}
void Main(int n, int k){
if(n == 1)cout << 0 << '\n';
else cout << qpow(2, n - 2) << '\n';
}
}
namespace SubTask3{
int _s[N];
int dp[N][3][3];
void Main(int n, int k){
if(n == 4)cout << 2 << '\n';
else{
int Res = 0;
for(int a : {0, 1}){
for(int b : {0, 1}){
for(int c : {0, 1}){
for(int d : {0, 1}){
_s[0] = a, _s[1] = b, _s[2] = c, _s[3] = d;
if(!_s[(a << 1) | b])continue;
if(!_s[(b << 1) | c])continue;
if(!_s[(c << 1) | d])continue;
if(a == 1)dp[4][0][0] = 1;
if(b == 1)dp[4][0][1] = 1;
if(c == 1)dp[4][1][0] = 1;
if(d == 1)dp[4][1][1] = 1;
for(int i = 5; i <= n; ++i){
for(int j : {0, 1}){
for(int k : {0, 1}){
if(i - 1 <= 4 && k != _s[i - 2])continue;
for(int l : {0, 1}){
if(i - 2 <= 4 && l != _s[i - 3])continue;
if(_s[(l << 1) | k] && _s[(k << 1) | j]){
(dp[i][k][j] += dp[i - 1][l][k]) %= mod;
}
}
}
}
}
for(int i : {0, 1}){
for(int j : {0, 1}){
(Res += dp[n][i][j]) %= mod;
}
}
for(int i = 0; i <= n; ++i)
for(int j : {0, 1})
for(int k : {0 , 1})dp[i][j][k] = 0;
}
}
}
}
cout << Res << '\n';
}
}
}
namespace SubTask4{
int _s[N], Res;
int dp[N][2][2][2];
int calc(int a, int b, int c){
return (a << 2) + (b << 1) + c;
}
void Main(int n, int k){
Res = 0;
if(n == 8)cout << 8 << '\n';
else{
for(int a : {0, 1}){
for(int b : {0, 1}){
for(int c : {0, 1}){
for(int d : {0, 1}){
for(int e : {0, 1}){
for(int f : {0, 1}){
for(int g : {0, 1}){
for(int h : {0, 1}){
_s[0] = a,_s[1] = b,_s[2] = c,_s[3] = d,_s[4] = e,_s[5] = f,_s[6] = g,_s[7] = h;
// cout << a << ' ' << b << ' ' << c << ' ' << d << ' ' << e << ' ' << f << ' ' << g << ' ' << h << '\n';
if(!_s[calc(a, b, c)])continue;
if(!_s[calc(b, c, d)])continue;
if(!_s[calc(c, d, e)])continue;
if(!_s[calc(d, e, f)])continue;
if(!_s[calc(e, f, g)])continue;
if(!_s[calc(f, g, h)])continue;
if(a == 1)dp[8][0][0][0] = 1;
if(b == 1)dp[8][0][0][1] = 1;
if(c == 1)dp[8][0][1][0] = 1;
if(d == 1)dp[8][0][1][1] = 1;
if(e == 1)dp[8][1][0][0] = 1;
if(f == 1)dp[8][1][0][1] = 1;
if(g == 1)dp[8][1][1][0] = 1;
if(h == 1)dp[8][1][1][1] = 1;
for(int i = 9; i <= n; ++i){
for(int a1 : {0, 1}){
for(int b1 : {0, 1}){
if(i - 1 <= 8 && b1 != _s[i - 2])continue;
for(int c1 : {0, 1}){
if(i - 2 <= 8 && c1 != _s[i - 3])continue;
for(int d1 : {0, 1}){
if(i - 3 <= 8 && d1 != _s[i - 4])continue;
if(_s[calc(d1, c1, b1)] && _s[calc(c1, b1, a1)]){
(dp[i][c1][b1][a1] += dp[i - 1][d1][c1][b1]) %= mod;
}
}
}
}
}
}
for(int i : {0, 1}){
for(int j : {0, 1}){
for(int k : {0, 1}){
(Res += dp[n][i][j][k]) %= mod;
// cout << "aa "<< dp[n][i][j][k] << '\n';
}
}
}
for(int i = 0; i <= n; ++i){
for(int j : {0, 1}){
for(int k : {0, 1}){
for(int z : {0, 1}){
dp[i][j][k][z] = 0;
}
}
}
}
}
}
}
}
}
}
}
}
cout << Res << '\n';
}
}
}
namespace SubTask5{
int _s[N], Res;
int dp[N][2][2][2][2];
int calc(int a, int b, int c, int d){
return (a << 3) | (b << 2) | (c << 1) | d;
}
void Main(int nn, int kk){
if(nn == 16)return cout << 268 << '\n', void();
for(int a : {0, 1}){//1
for(int b : {0, 1}){//2
for(int c : {0, 1}){//3
for(int d : {0, 1}){//4
for(int e : {0, 1}){//5
for(int f : {0, 1}){//6
for(int g : {0, 1}){//7
for(int h : {0, 1}){//8
for(int i : {0, 1}){//9
for(int j : {0, 1}){//10
for(int k : {0, 1}){//11
for(int l : {0, 1}){//12
for(int m : {0, 1}){//13
for(int n : {0, 1}){//14
for(int o : {0, 1}){//15
for(int p : {0, 1}){//16
// cout << "awa" << '\n';
_s[0] = a,_s[1] = b,_s[2] = c,_s[3] = d,_s[4] = e,_s[5] = f,_s[6] = g,_s[7] = h,_s[8] = i,_s[9] = j,_s[10] = k,_s[11] = l,_s[12] = m,_s[13] = n,_s[14] = o,_s[15] = p;
// cout << a << ' ' << b << ' ' << c << ' ' << d << ' ' << e << ' ' << f << ' ' << g << ' ' << h << ' ' << i << ' ' << j << ' ' << k << ' ' << l << ' ' << m <<' ' << n << ' ' << o << ' ' << p << '\n';
if(!_s[calc(a, b, c, d)])continue;
if(!_s[calc(b, c, d, e)])continue;
if(!_s[calc(c, d, e, f)])continue;
if(!_s[calc(d, e, f, g)])continue;
if(!_s[calc(e, f, g, h)])continue;
if(!_s[calc(f, g, h, i)])continue;
if(!_s[calc(g, h, i, j)])continue;
if(!_s[calc(h, i, j, k)])continue;
if(!_s[calc(i, j, k, l)])continue;
if(!_s[calc(j, k, l, m)])continue;
if(!_s[calc(k, l, m, n)])continue;
if(!_s[calc(l, m, n, o)])continue;
if(!_s[calc(m, n, o, p)])continue;
if(a == 1)dp[16][0][0][0][0] = 1;
if(b == 1)dp[16][0][0][0][1] = 1;
if(c == 1)dp[16][0][0][1][0] = 1;
if(d == 1)dp[16][0][0][1][1] = 1;
if(e == 1)dp[16][0][1][0][0] = 1;
if(f == 1)dp[16][0][1][0][1] = 1;
if(g == 1)dp[16][0][1][1][0] = 1;
if(h == 1)dp[16][0][1][1][1] = 1;
if(i == 1)dp[16][1][0][0][0] = 1;
if(j == 1)dp[16][1][0][0][1] = 1;
if(k == 1)dp[16][1][0][1][0] = 1;
if(l == 1)dp[16][1][0][1][1] = 1;
if(m == 1)dp[16][1][1][0][0] = 1;
if(n == 1)dp[16][1][1][0][1] = 1;
if(o == 1)dp[16][1][1][1][0] = 1;
if(p == 1)dp[16][1][1][1][1] = 1;
for(int ii = 17; ii <= nn; ++ii){
for(int a1 : {0, 1}){
if(ii - 4 <= 16 && a1 != _s[ii - 5])continue;
for(int b1 : {0, 1}){
if(ii - 3 <= 16 && b1 != _s[ii - 4])continue;
for(int c1 : {0, 1}){
if(ii - 2 <= 16 && c1 != _s[ii - 3])continue;
for(int d1 : {0, 1}){
if(ii - 1 <= 16 && d1 != _s[ii - 2])continue;
for(int e1 : {0, 1}){
if(_s[calc(a1, b1, c1, d1)] && _s[calc(b1, c1, d1, e1)]){
(dp[ii][b1][c1][d1][e1] += dp[ii - 1][a1][b1][c1][d1]) %= mod;
}
}
}
}
}
}
}
for(int aa : {0, 1}){
for(int bb : {0, 1}){
for(int cc : {0, 1}){
for(int dd : {0 , 1}){
(Res += dp[nn][aa][bb][cc][dd]) %= mod;
// if(dp[nn][aa][bb][cc][dd])cout << dp[nn][aa][bb][cc][dd] << ' ' << aa << ' ' << bb << ' ' << cc << ' ' << dd << '\n';
}
}
}
}
for(int ii = 0; ii <= nn; ++ii){
for(int aa : {0, 1}){
for(int bb : {0, 1}){
for(int cc : {0, 1}){
for(int dd : {0 , 1}){
dp[ii][aa][bb][cc][dd] = 0;
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
cout << Res << '\n';
}
}
signed main(){
freopen("binary.in","r",stdin);freopen("binary.out","w",stdout);
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
cin >> n >> k;
// SubTask5 :: Main(n, k);
if(n <= 20 && k <= 4)SubTask1 :: Main(n, k);
else if(k == 1)SubTask2 :: Main(n, k);
else if(k == 2)SubTask3 :: Main(n, k);
else if(k == 3)SubTask4 :: Main(n, k);
else SubTask5 :: Main(n, k);
return 0;
}
// aolinpikepinbaodasai

浙公网安备 33010602011771号