Submission #39079357
Source Code Expand
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,a,b) for(int i=(a);i>=(b);i--)
#define op(x) ((x&1)?x+1:x-1)
#define odd(x) (x&1)
#define even(x) (!odd(x))
#define lc(x) (x<<1)
#define rc(x) (lc(x)|1)
#define lowbit(x) (x&-x)
#define mp(x,y) make_pair(x,y)
typedef long long ll;
typedef unsigned long long ull;
typedef double db;
using namespace std;
const int MAXN=3010,MAXM=1.2e4+10,MAXL=1e7+10,LIM=1e7,mod=998244353;
ll mypow(ll a,ll n){
if(!n)return 1;ll tmp=mypow(a,n/2);
tmp=tmp*tmp%mod;if(n&1)tmp=tmp*a%mod;return tmp;
return tmp;
}
ll myinv(ll a){return mypow(a,mod-2);}
void add(ll& x,ll y){x=(x+y)%mod;}
void sub(ll& x,ll y){x=(x-y+mod)%mod;}
//
ll fact[MAXL],rfact[MAXL];
void preSolve(){
fact[0]=1;rep(i,1,LIM)fact[i]=fact[i-1]*i%mod;
rfact[LIM]=myinv(fact[LIM]);per(i,LIM-1,0)rfact[i]=rfact[i+1]*(i+1)%mod;
}
ll C(ll n,ll m){
if(m<0 || n<m)return 0;
return fact[n]*rfact[m]%mod*rfact[n-m]%mod;
}
ll P(ll n){return (n%2)?(mod-1):(1);}
ll n,m,k;
ll ans;
ll sum[2][MAXN][MAXN*2]; //二维差分统计不等式解数
ll simple_sum[2][MAXN];
ll S(ll n,ll k){
if(n==0)return k==0;
//x1+x2+...+xn=k
ll res=0;
rep(i,0,n)if(i*(m+1)<=k){
ll rest=k-i*(m+1),ways=C(n,i)*P(i)%mod*C(rest+n-1,n-1)%mod;
add(res,ways);
}
return res;
}
ll S2[MAXM],S3[MAXM],T2[MAXM];
ll calc1(){
ll res=0;
rep(sum,0,min(k,4*m))if(even(sum)){
rep(rsum,sum/2+1,sum){
ll ways=T2[rsum]*S2[sum-rsum]%mod;
add(res,ways);
}
}
return res;
}
ll calc2(){
ll res=0;
rep(b,0,m)rep(d,0,b-1)if(b+d<=k){
int c=d-b,rest=k-b-d;
//|x1-x2| < -c 且 x1+x2 <= rest 且奇偶性固定的的方案数
ll ways=S3[d];
if(rest<=2*m){
ways=ways*sum[odd((b+d))][-c-1][rest]%mod;
}else{
ways=ways*simple_sum[odd((b+d))][-c-1]%mod;
}
add(res,ways);
}
return res;
}
namespace GF{
ll F[MAXL],G[MAXL];
void pre(){
rep(i,0,n){
if((m+1)*i <= k){
add(F[(m+1)*i],1ll*C(n,i)*P(i)%mod);
}
}
rep(i,2,k)add(F[i],F[i-2]);
rep(i,0,k)G[i]=C(i+n-1,i);
if(even(k))rep(i,0,k)add(ans,F[i]*G[k-i]%mod);
else rep(i,0,k-1)add(ans,F[i]*G[k-i-1]%mod);
}
}
int main(){
preSolve();
cin>>n>>m>>k;
GF::pre();
//
rep(x1,0,m)rep(x2,0,m){
add(sum[odd((x1+x2))][abs(x1-x2)][x1+x2],1);
add(simple_sum[odd((x1+x2))][abs(x1-x2)],1);
}
rep(flag,0,1){
rep(i,1,m)add(simple_sum[flag][i],simple_sum[flag][i-1]);
rep(i,0,m)rep(j,0,2*m){
if(i)add(sum[flag][i][j],sum[flag][i-1][j]);
if(j)add(sum[flag][i][j],sum[flag][i][j-1]);
if(i&&j)sub(sum[flag][i][j],sum[flag][i-1][j-1]);
}
}
rep(i,0,min(k,4*m))S2[i]=S(n-2,i),T2[i]=S(2,i),S3[i]=S(n-3,i);
sub(ans,n*calc1()%mod);
add(ans,n*calc2()%mod);
cout<<ans<<endl;
return 0;
}
Submission Info
Submission Time
2023-02-21 11:00:07+0900
Task
E - Non-Adjacent Matching
User
Crying
Language
C++ (GCC 9.2.1)
Score
800
Code Size
2835 Byte
Status
AC
Exec Time
1100 ms
Memory
582920 KiB
Compile Error
./Main.cpp: In function ‘ll mypow(ll, ll)’:
./Main.cpp:17:2: warning: this ‘if’ clause does not guard... [-Wmisleading-indentation]
17 | if(!n)return 1;ll tmp=mypow(a,n/2);
| ^~
./Main.cpp:17:17: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the ‘if’
17 | if(!n)return 1;ll tmp=mypow(a,n/2);
| ^~
Judge Result
Set Name
Sample
All
Score / Max Score
0 / 0
800 / 800
Status
Set Name
Test Cases
Sample
00_sample_01.txt, 00_sample_02.txt, 00_sample_03.txt
All
00_sample_01.txt, 00_sample_02.txt, 00_sample_03.txt, 01_small_01.txt, 01_small_02.txt, 01_small_03.txt, 01_small_04.txt, 01_small_05.txt, 01_small_06.txt, 01_small_07.txt, 01_small_08.txt, 01_small_09.txt, 01_small_10.txt, 02_random_01.txt, 02_random_02.txt, 02_random_03.txt, 02_random_04.txt, 02_random_05.txt, 02_random_06.txt, 02_random_07.txt, 02_random_08.txt, 02_random_09.txt, 02_random_10.txt, 03_large_01.txt, 03_large_02.txt, 03_large_03.txt, 03_large_04.txt, 03_large_05.txt, 03_large_06.txt, 03_large_07.txt, 03_large_08.txt, 03_large_09.txt, 03_large_10.txt, 03_large_11.txt, 03_large_12.txt, 03_large_13.txt, 03_large_14.txt, 03_large_15.txt, 03_large_16.txt, 03_large_17.txt, 03_large_18.txt, 03_large_19.txt, 03_large_20.txt, 03_large_21.txt, 03_large_22.txt, 03_large_23.txt, 04_handmade_01.txt, 04_handmade_02.txt, 04_handmade_03.txt, 04_handmade_04.txt
Case Name
Status
Exec Time
Memory
00_sample_01.txt
AC
174 ms
159744 KiB
00_sample_02.txt
AC
172 ms
159748 KiB
00_sample_03.txt
AC
174 ms
162176 KiB
01_small_01.txt
AC
171 ms
160268 KiB
01_small_02.txt
AC
171 ms
160268 KiB
01_small_03.txt
AC
171 ms
159736 KiB
01_small_04.txt
AC
172 ms
160356 KiB
01_small_05.txt
AC
169 ms
160404 KiB
01_small_06.txt
AC
174 ms
159920 KiB
01_small_07.txt
AC
169 ms
159640 KiB
01_small_08.txt
AC
174 ms
160700 KiB
01_small_09.txt
AC
170 ms
160060 KiB
01_small_10.txt
AC
171 ms
160832 KiB
02_random_01.txt
AC
547 ms
313408 KiB
02_random_02.txt
AC
632 ms
339476 KiB
02_random_03.txt
AC
840 ms
424360 KiB
02_random_04.txt
AC
517 ms
306824 KiB
02_random_05.txt
AC
413 ms
261240 KiB
02_random_06.txt
AC
191 ms
170296 KiB
02_random_07.txt
AC
581 ms
326384 KiB
02_random_08.txt
AC
231 ms
189688 KiB
02_random_09.txt
AC
937 ms
466812 KiB
02_random_10.txt
AC
518 ms
331640 KiB
03_large_01.txt
AC
1098 ms
582636 KiB
03_large_02.txt
AC
924 ms
442464 KiB
03_large_03.txt
AC
1055 ms
546808 KiB
03_large_04.txt
AC
1100 ms
582920 KiB
03_large_05.txt
AC
613 ms
342172 KiB
03_large_06.txt
AC
748 ms
383872 KiB
03_large_07.txt
AC
758 ms
420044 KiB
03_large_08.txt
AC
567 ms
317124 KiB
03_large_09.txt
AC
722 ms
380076 KiB
03_large_10.txt
AC
693 ms
384112 KiB
03_large_11.txt
AC
929 ms
487528 KiB
03_large_12.txt
AC
728 ms
391504 KiB
03_large_13.txt
AC
651 ms
360296 KiB
03_large_14.txt
AC
617 ms
374944 KiB
03_large_15.txt
AC
795 ms
446536 KiB
03_large_16.txt
AC
948 ms
514408 KiB
03_large_17.txt
AC
794 ms
462780 KiB
03_large_18.txt
AC
979 ms
530908 KiB
03_large_19.txt
AC
793 ms
454684 KiB
03_large_20.txt
AC
727 ms
428336 KiB
03_large_21.txt
AC
889 ms
498312 KiB
03_large_22.txt
AC
817 ms
477024 KiB
03_large_23.txt
AC
645 ms
393568 KiB
04_handmade_01.txt
AC
820 ms
441956 KiB
04_handmade_02.txt
AC
170 ms
159632 KiB
04_handmade_03.txt
AC
885 ms
442492 KiB
04_handmade_04.txt
AC
811 ms
441956 KiB