#include<stdio.h> #include<vector> using namespace std; long long int ac(vector<long long int>poz[],int p,int k){ if(k<0||k>=poz[p].size()){ return 0; } return poz[p][k]; } int wyp(bool zaj[],int k){ int id=0; while(k>0){ if(zaj[id]==0)k--; id++; } while(zaj[id])id++; zaj[id]=1; return id; } int main(){ int n; long long int k; scanf("%d %lld",&n,&k); //A008302 vector<long long int>poz[n+1]; poz[2].push_back(1); for(int p=3;p<n+1;p++){ for(int k=0;k<(p-2)*(p-1)/2+1;k++){ poz[p].push_back(ac(poz,p-1,k)+ac(poz,p,k-1)-ac(poz,p-1,k-p+1)); } } bool zaj[n]; for(int i=0;i<n;i++)zaj[i]=0; int per[n]; int ind=((n-1)*n)/4-n+1; for(int p=n;p>1;p--){ int ak=ind; while(k>ac(poz,p,ind)&&ind<=((n-1)*n)/4){ k-=ac(poz,p,ind); ind++; } if(ind>((n-1)*n)/4){ printf("NIE\n"); return 0; } per[n-p]=wyp(zaj,ind-ak)+1; ind-=p-2; } per[n-1]=wyp(zaj,0)+1; printf("TAK\n"); for(int i=0;i<n;i++)printf("%d ",per[i]); printf("\n"); }
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 | #include<stdio.h> #include<vector> using namespace std; long long int ac(vector<long long int>poz[],int p,int k){ if(k<0||k>=poz[p].size()){ return 0; } return poz[p][k]; } int wyp(bool zaj[],int k){ int id=0; while(k>0){ if(zaj[id]==0)k--; id++; } while(zaj[id])id++; zaj[id]=1; return id; } int main(){ int n; long long int k; scanf("%d %lld",&n,&k); //A008302 vector<long long int>poz[n+1]; poz[2].push_back(1); for(int p=3;p<n+1;p++){ for(int k=0;k<(p-2)*(p-1)/2+1;k++){ poz[p].push_back(ac(poz,p-1,k)+ac(poz,p,k-1)-ac(poz,p-1,k-p+1)); } } bool zaj[n]; for(int i=0;i<n;i++)zaj[i]=0; int per[n]; int ind=((n-1)*n)/4-n+1; for(int p=n;p>1;p--){ int ak=ind; while(k>ac(poz,p,ind)&&ind<=((n-1)*n)/4){ k-=ac(poz,p,ind); ind++; } if(ind>((n-1)*n)/4){ printf("NIE\n"); return 0; } per[n-p]=wyp(zaj,ind-ak)+1; ind-=p-2; } per[n-1]=wyp(zaj,0)+1; printf("TAK\n"); for(int i=0;i<n;i++)printf("%d ",per[i]); printf("\n"); } |