Submission #38936088


Source Code Expand

#include <bits/stdc++.h>
#include <atcoder/modint>
const int MOD=998244353;
using mint = atcoder::static_modint<MOD>;
using namespace std;
#define rep(i,a,n) for (int i=a;i<(int)(n);i++)
#define per(i,a,n) for (int i=n;i-->(int)(a);)
int read(){int r;scanf("%d",&r);return r;}
const int PWR=32;
mint fac[210]={1};
mint ifac[210];
mint binom[210][210];
mint downpow(int x,int y){ // x向下一共y个 prod, O(y)
  mint res=1;
  rep(i,x-y+1,x+1) res*=i;
  return res;
}
int main(){
  int n=read();
  int m=read();
  int x=read();
  rep(i,1,n+1) fac[i]=fac[i-1]*i;
  ifac[n] = fac[n].inv();
  per(i,0,n) ifac[i]=ifac[i+1]*(i+1);
  rep(i,0,n+1) rep(j,0,i+1) binom[i][j]=(j?binom[i-1][j]+binom[i-1][j-1]:1);
  // ---
  vector<mint> f(n+1,0); // f[i] = 长度i的数组, 元素 <= M, xor == X的方案数
  rep(l,1,n+1){ // O(n3 log n)
    vector dp(PWR, vector<mint>(l+1,0)); // f[高w位][和m相同的个数] 且高w位xor == x的高w位 的 个数
    dp[PWR-1][l]=1; // 默认PWR-1位0 全部都同 且满足xor == x的PWR-1位
    per(i,0,PWR-1){ // 第i bit位
      int cm=(m>>i)&1;
      int cx=(x>>i)&1;
      rep(j,0,l+1){ // i+1位 有j个和m相同
        array<mint,2> cnt = {0,0}; // l-j 个中选[奇偶] 的方案数
        rep(k,0,l-j+1) cnt[k&1]+=binom[l-j][k];
        if(cm) rep(k,0,j+1) dp[i][k]+=dp[i+1][j]*binom[j][k]*cnt[cx^(k&1)]; // j个中选k个填1,剩下的填0,在j以外的选择来保持xor == x
        else { // 第i个bit和m相同的只能填0
          int k=0; // 0个和m相同的填1
          dp[i][j]+=dp[i+1][j]*binom[j][0]*cnt[cx^(k&1)];
        }
      }
    }
    rep(j,0,l+1) f[l]+=dp[0][j];
  }
  vector odd(n+1,vector<mint>(n+1,0)); // odd[i][j] = 1...i 分成j个不区分大小位奇数非空组方案数
  vector even(n+1,vector<mint>(n+1,0)); // even[i][j] = 1...i 分成j个不区分大小位偶数非空组方案数
  odd[0][0]=even[0][0]=1;
  rep(i,1,n+1) rep(j,1,i+1) rep(k,1,i+1) { // 拆出来的大小为k
    auto &arr=((k&1)?odd:even);
    arr[i][j]+=binom[i-1][k-1]*arr[i-k][j-1]; // 为了唯一性,设这个总是包含最小元素, 所以是binom(i-1,k-1)
  }
  vector right(n+1,vector<mint>(n+1,0));
  rep(i,0,n+1) rep(j,0,n+1) rep(k,0,i+1) right[i][j]+=even[i][k]*downpow(m+1-j,k);
  vector<mint>g(n+1,0);
  g[0]=!x;
  rep(l,1,n+1){
    g[l]=f[l];
    rep(i,0,l+1) rep(j,0,min(i,l-1)+1) g[l]-=binom[l][i]*odd[i][j]*g[j]*right[l-i][j];
  }
  mint ans=0;
  rep(i,0,n/2+1) ans+=g[n-2*i]*ifac[n-2*i]*downpow(m+i,i)*ifac[i];
  printf("%d\n",ans.val());
  return 0;
}

Submission Info

Submission Time
Task Ex - A Nameless Counting Problem
User cromarmot
Language C++ (GCC 9.2.1)
Score 600
Code Size 2593 Byte
Status AC
Exec Time 1118 ms
Memory 4572 KiB

Compile Error

./Main.cpp: In function ‘int read()’:
./Main.cpp:8:23: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
    8 | int read(){int r;scanf("%d",&r);return r;}
      |                  ~~~~~^~~~~~~~~

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 600 / 600
Status
AC × 2
AC × 80
Set Name Test Cases
Sample example0.txt, example1.txt
All 000.txt, 001.txt, 002.txt, 003.txt, 004.txt, 005.txt, 006.txt, 007.txt, 008.txt, 009.txt, 010.txt, 011.txt, 012.txt, 013.txt, 014.txt, 015.txt, 016.txt, 017.txt, 018.txt, 019.txt, 020.txt, 021.txt, 022.txt, 023.txt, 024.txt, 025.txt, 026.txt, 027.txt, 028.txt, 029.txt, 030.txt, 031.txt, 032.txt, 033.txt, 034.txt, 035.txt, 036.txt, 037.txt, 038.txt, 039.txt, 040.txt, 041.txt, 042.txt, 043.txt, 044.txt, 045.txt, 046.txt, 047.txt, 048.txt, 049.txt, 050.txt, 051.txt, 052.txt, 053.txt, 054.txt, 055.txt, 056.txt, 057.txt, 058.txt, 059.txt, 060.txt, 061.txt, 062.txt, 063.txt, 064.txt, 065.txt, 066.txt, 067.txt, 068.txt, 069.txt, 070.txt, 071.txt, 072.txt, 073.txt, 074.txt, 075.txt, 076.txt, 077.txt, example0.txt, example1.txt
Case Name Status Exec Time Memory
000.txt AC 8 ms 3936 KiB
001.txt AC 2 ms 3932 KiB
002.txt AC 2 ms 3832 KiB
003.txt AC 2 ms 3936 KiB
004.txt AC 1021 ms 4520 KiB
005.txt AC 1118 ms 4560 KiB
006.txt AC 1055 ms 4568 KiB
007.txt AC 1087 ms 4524 KiB
008.txt AC 1018 ms 4572 KiB
009.txt AC 1118 ms 4524 KiB
010.txt AC 1055 ms 4520 KiB
011.txt AC 1078 ms 4504 KiB
012.txt AC 1017 ms 4556 KiB
013.txt AC 1117 ms 4472 KiB
014.txt AC 1061 ms 4568 KiB
015.txt AC 1065 ms 4408 KiB
016.txt AC 1016 ms 4572 KiB
017.txt AC 1116 ms 4568 KiB
018.txt AC 1071 ms 4520 KiB
019.txt AC 1058 ms 4472 KiB
020.txt AC 1031 ms 4556 KiB
021.txt AC 1035 ms 4524 KiB
022.txt AC 1028 ms 4468 KiB
023.txt AC 1030 ms 4468 KiB
024.txt AC 1030 ms 4472 KiB
025.txt AC 1023 ms 4468 KiB
026.txt AC 1023 ms 4508 KiB
027.txt AC 1021 ms 4464 KiB
028.txt AC 1019 ms 4508 KiB
029.txt AC 1030 ms 4468 KiB
030.txt AC 753 ms 4472 KiB
031.txt AC 315 ms 4236 KiB
032.txt AC 83 ms 4000 KiB
033.txt AC 91 ms 3944 KiB
034.txt AC 62 ms 3976 KiB
035.txt AC 211 ms 4200 KiB
036.txt AC 13 ms 3936 KiB
037.txt AC 697 ms 4336 KiB
038.txt AC 47 ms 3952 KiB
039.txt AC 807 ms 4444 KiB
040.txt AC 242 ms 4060 KiB
041.txt AC 94 ms 4108 KiB
042.txt AC 3 ms 3852 KiB
043.txt AC 100 ms 4116 KiB
044.txt AC 2 ms 3888 KiB
045.txt AC 805 ms 4384 KiB
046.txt AC 530 ms 4220 KiB
047.txt AC 155 ms 3992 KiB
048.txt AC 1070 ms 4528 KiB
049.txt AC 1074 ms 4508 KiB
050.txt AC 1071 ms 4568 KiB
051.txt AC 1071 ms 4472 KiB
052.txt AC 1062 ms 4524 KiB
053.txt AC 1069 ms 4472 KiB
054.txt AC 1074 ms 4472 KiB
055.txt AC 1076 ms 4472 KiB
056.txt AC 1087 ms 4568 KiB
057.txt AC 1073 ms 4564 KiB
058.txt AC 1068 ms 4456 KiB
059.txt AC 1063 ms 4468 KiB
060.txt AC 1066 ms 4524 KiB
061.txt AC 1071 ms 4520 KiB
062.txt AC 1077 ms 4524 KiB
063.txt AC 1071 ms 4460 KiB
064.txt AC 1065 ms 4560 KiB
065.txt AC 1061 ms 4400 KiB
066.txt AC 1061 ms 4472 KiB
067.txt AC 1063 ms 4568 KiB
068.txt AC 1064 ms 4404 KiB
069.txt AC 1056 ms 4468 KiB
070.txt AC 1056 ms 4468 KiB
071.txt AC 1084 ms 4468 KiB
072.txt AC 1072 ms 4472 KiB
073.txt AC 1062 ms 4572 KiB
074.txt AC 1061 ms 4408 KiB
075.txt AC 1065 ms 4540 KiB
076.txt AC 1062 ms 4556 KiB
077.txt AC 1079 ms 4520 KiB
example0.txt AC 4 ms 3772 KiB
example1.txt AC 1075 ms 4568 KiB