1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include <bits/stdc++.h>
#define lld long long
#ifdef WIN32
#define gcx getchar()
#elif __linux__
#define gcx getchar_unlocked()
#endif

using namespace std;

lld m,n,x,d,k,r;
lld t[100];
lld w[100],s[100];
lld ne[100],pr[100];
lld st[100];

int main()
{
	scanf("%d%d%d",&n,&x,&d);
	//for(int n=1;n<13;++n)
	//{
	//printf("\\%d/\n",n);
	s[0]=1;
	for(int i=0;i<n;++i) 
	{
		t[i]=i+1;
		s[i+1]=s[i]*(i+1);
	}
	//while(--m) next_permutation(t,t+n);
	//printf("%lld",s[n]);
	for(lld i=0;i<s[n];--s[n])
	{
		for(int j=0;j<n;++j) 
		{
			ne[j]=j+1; pr[j]=j-1;
		}
		k=n;
		m=0;/*
		printf("%d\n",i);
		for(int j=0;j<n;++j)
		{
			printf("%d ",t[j]);
		}
		puts("\n--------------------");*/
		while(k>1)
		{
			r=k;
			for(int j=0;j<n;j=ne[j])
			{
				if(j==0) 
				{
					if(t[ne[j]]>t[j])
					{
						st[k]=j;
						--k;
					}
				}
				if(j==n-1)
				{
					if(t[pr[j]]>t[j])
					{
						st[k]=j;
						--k;
					}
				}
				if(j!=0&&j!=n-1)
				{
					if(t[ne[j]]>t[j]||t[pr[j]]>t[j])
					{
						st[k]=j;
						--k;
					}
				}
			}
			for(int j=r;j>k;--j)
			{
				pr[ne[st[j]]]=pr[st[j]];
				ne[pr[st[j]]]=ne[st[j]];
			}
			m++;
		}
		//printf("----%d----\n",m);
		w[m]++;
		next_permutation(t,t+n);
	}
	printf("%d",w[x]%d);
	/*for(int i=1;i<=n;++i) printf("%d %lld\n",i,w[i]);
	//puts("-----------------------------------------------------------------------------------");
	for(int i=0;i<n;++i)
	{
		w[i]=0;
		t[i]=0;
		s[i]=0;
		st[i]=0;
	}
	}*/
	return 0;
}