#include <iostream> #include <vector> #include <algorithm> using namespace std; long long k,p; long long tablicaprzedzialow[1024][2]; vector<long long>listaprzejsc[1024]; bool majawspolne(long long l, long long m) { long long l0 = tablicaprzedzialow[l][0]; long long l1 = tablicaprzedzialow[l][1]; long long m0 = tablicaprzedzialow[m][0]; long long m1 = tablicaprzedzialow[m][1]; return l0<=m1 && l1>=m0; } void wypisz() { for(long long i=0;i<k;i++) { printf("%lld (%lld,%lld): ",i,tablicaprzedzialow[i][0],tablicaprzedzialow[i][1]); for_each(listaprzejsc[i].begin(), listaprzejsc[i].end(),[](auto w){ printf("%lld ",w); }); printf("\n"); } } vector<long long> suma1; vector<long long> suma2; long long zsumujsuma2(long long p) { long long s=0; for_each(suma2.begin(),suma2.end(),[&](auto i){ s+=i; s%=p; }); return s; } int main() { // your code goes here long long n,m; k=0; scanf("%lld%lld%lld",&m,&n,&p); for(long long i=1;i<=n;i++)for(long long j=i;j<=n;j++) { tablicaprzedzialow[k][0]=i; tablicaprzedzialow[k++][1]=j; } if(m==1){printf("%lld\n",k);return 0;}; for(long long i=0;i<k;i++) { long long z=0; for(long long j=0;j<k;j++) { if(majawspolne(i,j)) { z++; listaprzejsc[i].push_back(j); } } suma1.push_back(1); suma2.push_back(z); } //wypisz(); for(long long o=2;o<m;o++) { suma1=suma2; for(long long j=0;j<k;j++)suma2[j]=0; for(long long j=0;j<k;j++) { for_each(listaprzejsc[j].begin(),listaprzejsc[j].end(),[&](auto w){ suma2[w]+=suma1[j]; suma2[w]%=p; }); } } printf("%lld\n",zsumujsuma2(p)); 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 82 83 84 85 86 87 | #include <iostream> #include <vector> #include <algorithm> using namespace std; long long k,p; long long tablicaprzedzialow[1024][2]; vector<long long>listaprzejsc[1024]; bool majawspolne(long long l, long long m) { long long l0 = tablicaprzedzialow[l][0]; long long l1 = tablicaprzedzialow[l][1]; long long m0 = tablicaprzedzialow[m][0]; long long m1 = tablicaprzedzialow[m][1]; return l0<=m1 && l1>=m0; } void wypisz() { for(long long i=0;i<k;i++) { printf("%lld (%lld,%lld): ",i,tablicaprzedzialow[i][0],tablicaprzedzialow[i][1]); for_each(listaprzejsc[i].begin(), listaprzejsc[i].end(),[](auto w){ printf("%lld ",w); }); printf("\n"); } } vector<long long> suma1; vector<long long> suma2; long long zsumujsuma2(long long p) { long long s=0; for_each(suma2.begin(),suma2.end(),[&](auto i){ s+=i; s%=p; }); return s; } int main() { // your code goes here long long n,m; k=0; scanf("%lld%lld%lld",&m,&n,&p); for(long long i=1;i<=n;i++)for(long long j=i;j<=n;j++) { tablicaprzedzialow[k][0]=i; tablicaprzedzialow[k++][1]=j; } if(m==1){printf("%lld\n",k);return 0;}; for(long long i=0;i<k;i++) { long long z=0; for(long long j=0;j<k;j++) { if(majawspolne(i,j)) { z++; listaprzejsc[i].push_back(j); } } suma1.push_back(1); suma2.push_back(z); } //wypisz(); for(long long o=2;o<m;o++) { suma1=suma2; for(long long j=0;j<k;j++)suma2[j]=0; for(long long j=0;j<k;j++) { for_each(listaprzejsc[j].begin(),listaprzejsc[j].end(),[&](auto w){ suma2[w]+=suma1[j]; suma2[w]%=p; }); } } printf("%lld\n",zsumujsuma2(p)); return 0; } |