#include<cstdio> typedef long long ll; const int N=1000010; const ll inf=1000000000000000010LL; int n,i,j,k,o;ll K,t,f[N][3],g[N][3]; inline void up(ll&x,ll y){ x+=y; if(x>inf)x=inf; } int main(){ scanf("%d%lld",&n,&K); f[1][0]=f[1][1]=f[1][2]=1; for(i=2;i<=n;i++)for(j=0;j<3;j++)for(k=0;k<3;k++)if(j!=k)up(f[i][j],f[i-1][k]); for(i=1;i<=n;i++)for(j=0;j<3;j++){ g[i][j]=g[i-1][j]; up(g[i][j],f[i][j]); } t=g[n][0]; up(t,g[n][1]); up(t,g[n][2]); if(t<K)return puts("NIE"),0; for(o=-1,i=1;;i++)for(j=0;j<3;j++)if(j!=o){ for(t=1,k=0;k<3;k++)if(k!=j)up(t,g[n-i][k]); if(t<K){K-=t;continue;} o=j; putchar(j+'a'); if(K==1)return 0; K--; break; } }
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 | #include<cstdio> typedef long long ll; const int N=1000010; const ll inf=1000000000000000010LL; int n,i,j,k,o;ll K,t,f[N][3],g[N][3]; inline void up(ll&x,ll y){ x+=y; if(x>inf)x=inf; } int main(){ scanf("%d%lld",&n,&K); f[1][0]=f[1][1]=f[1][2]=1; for(i=2;i<=n;i++)for(j=0;j<3;j++)for(k=0;k<3;k++)if(j!=k)up(f[i][j],f[i-1][k]); for(i=1;i<=n;i++)for(j=0;j<3;j++){ g[i][j]=g[i-1][j]; up(g[i][j],f[i][j]); } t=g[n][0]; up(t,g[n][1]); up(t,g[n][2]); if(t<K)return puts("NIE"),0; for(o=-1,i=1;;i++)for(j=0;j<3;j++)if(j!=o){ for(t=1,k=0;k<3;k++)if(k!=j)up(t,g[n-i][k]); if(t<K){K-=t;continue;} o=j; putchar(j+'a'); if(K==1)return 0; K--; break; } } |