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
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 |
|
|
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 |