提出 #14835675
ソースコード 拡げる
#include<cstdio>
int N,K,P,fac[210],ifac[210];
long long inv(int a,int p=P){return a==1?1:(1+p*(a-inv(p%a,a)))/a%p;}
int C(int n,int m){return m<0||m>n?0:1ll*fac[n]*ifac[m]%P*ifac[n-m]%P;}
int calc(int a,int b,int k){
if(a>k+1||b>k)return 0;
int x=a>k,s=0;
for(int i=k+1,j=b;j<=a+b-x;i+=k*2+3-a-b,j+=k*2+3-a-b)s=((s+P-C(a+b-x,i))%P+C(a+b-x,j))%P;
for(int i=a+b-k-2,j=a+b*2-k*2-3;i>=0;i-=k*2+3-a-b,j-=k*2+3-a-b)s=((s+P-C(a+b-x,i))%P+C(a+b-x,j))%P;
if(a+b-1<=k)s=(s+P-1)%P;
if(a+b<=k)s=(s+P-1)%P;
return s;
}
int main(){
scanf("%d%d%d",&N,&K,&P);
for(int i=*fac=1;i<=N;i++)fac[i]=1ll*fac[i-1]*i%P;
ifac[N]=inv(fac[N]);
for(int i=N;i;i--)ifac[i-1]=1ll*ifac[i]*i%P;
int s=K>=N-1?fac[N]:0;
for(int i=0;i<=N-3&&K-i>=(N-i)/2;i++){
int t=K<N-2?0:N-i-2;
for(int j=1;j<=K-i&&j<N-i-1;j++)t=(t+calc(j,N-i-j-1,K-i))%P;
s=(s+1ll*fac[N]*ifac[N-i]%P*fac[N-i-1]%P*t)%P;
}
printf("%d\n",s);
}
提出情報
ジャッジ結果
セット名 |
Sample |
All |
得点 / 配点 |
0 / 0 |
2000 / 2000 |
結果 |
|
|
セット名 |
テストケース |
Sample |
s1.txt, s2.txt, s3.txt |
All |
01.txt, 02.txt, 03.txt, 04.txt, 05.txt, 06.txt, 07.txt, 08.txt, 09.txt, 10.txt, 11.txt, 12.txt, 13.txt, 14.txt, 15.txt, 16.txt, 17.txt, 18.txt, 19.txt, 20.txt, s1.txt, s2.txt, s3.txt |
ケース名 |
結果 |
実行時間 |
メモリ |
01.txt |
AC |
10 ms |
2968 KiB |
02.txt |
AC |
7 ms |
3144 KiB |
03.txt |
AC |
4 ms |
3152 KiB |
04.txt |
AC |
3 ms |
3060 KiB |
05.txt |
AC |
2 ms |
2996 KiB |
06.txt |
AC |
2 ms |
3000 KiB |
07.txt |
AC |
2 ms |
3108 KiB |
08.txt |
AC |
2 ms |
2964 KiB |
09.txt |
AC |
2 ms |
2968 KiB |
10.txt |
AC |
3 ms |
3148 KiB |
11.txt |
AC |
5 ms |
3036 KiB |
12.txt |
AC |
4 ms |
3060 KiB |
13.txt |
AC |
8 ms |
3008 KiB |
14.txt |
AC |
4 ms |
3140 KiB |
15.txt |
AC |
2 ms |
2960 KiB |
16.txt |
AC |
3 ms |
3176 KiB |
17.txt |
AC |
2 ms |
3144 KiB |
18.txt |
AC |
4 ms |
3148 KiB |
19.txt |
AC |
3 ms |
3108 KiB |
20.txt |
AC |
2 ms |
2964 KiB |
s1.txt |
AC |
2 ms |
3148 KiB |
s2.txt |
AC |
5 ms |
3008 KiB |
s3.txt |
AC |
3 ms |
2960 KiB |