#include<bits/stdc++.h>
#define ff first
#define ss second
using namespace std;
long long int n,k,p,i,j,w,r,c,c1,s,backup[1007];
pair <long long int, long long int> tab[1007];
vector <long long int> v;
int main()
{
scanf("%lld%lld%lld", &n, &k, &p);
r=n;
while(r > 1)
{
c++;
r++;
r/=2;
}
// printf("TEST n=%lld; k=%lld; p=%lld; log(n)=%lld;\n", n, k, p, c);
if(k > c)
{
// printf("EXIT 1\n");
printf("0");
}
else if(k == 1)
{
// printf("EXIT 3\n");
printf("%lld", (2*n-2)%p);
}
else
{
for(i=1; i<=n; i++)
{
tab[i].ff=i;
}
while(next_permutation(tab+1, tab+n+1))
{
for(i=1; i<=n; i++)
{
backup[i]=tab[i].ff;
tab[i].ss=0;
// printf("%lld ", tab[i].ff);
}
// puts("");
r=0;
s=n;
while(s > 1)
{
r++;
v.clear();
c1=s;
for(i=1; i<=c1; i++)
{
if(tab[i-1].ff < tab[i].ff && tab[i+1].ff < tab[i].ff)
{
tab[i].ss++;
v.push_back(i);
}
}
s=v.size();
for(i=0; i<s; i++)
{
swap(tab[i+1], tab[v[i]]);
}
tab[s+1].ff=0;
}
if(r == k)
{
w++;
w%=p;
}
for(i=1; i<=n; i++)
{
tab[i].ff=backup[i];
}
}
// printf("EXIT 4\n");
printf("%lld", w);
}
return 0;
}
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 | #include<bits/stdc++.h> #define ff first #define ss second using namespace std; long long int n,k,p,i,j,w,r,c,c1,s,backup[1007]; pair <long long int, long long int> tab[1007]; vector <long long int> v; int main() { scanf("%lld%lld%lld", &n, &k, &p); r=n; while(r > 1) { c++; r++; r/=2; } // printf("TEST n=%lld; k=%lld; p=%lld; log(n)=%lld;\n", n, k, p, c); if(k > c) { // printf("EXIT 1\n"); printf("0"); } else if(k == 1) { // printf("EXIT 3\n"); printf("%lld", (2*n-2)%p); } else { for(i=1; i<=n; i++) { tab[i].ff=i; } while(next_permutation(tab+1, tab+n+1)) { for(i=1; i<=n; i++) { backup[i]=tab[i].ff; tab[i].ss=0; // printf("%lld ", tab[i].ff); } // puts(""); r=0; s=n; while(s > 1) { r++; v.clear(); c1=s; for(i=1; i<=c1; i++) { if(tab[i-1].ff < tab[i].ff && tab[i+1].ff < tab[i].ff) { tab[i].ss++; v.push_back(i); } } s=v.size(); for(i=0; i<s; i++) { swap(tab[i+1], tab[v[i]]); } tab[s+1].ff=0; } if(r == k) { w++; w%=p; } for(i=1; i<=n; i++) { tab[i].ff=backup[i]; } } // printf("EXIT 4\n"); printf("%lld", w); } return 0; } |
English