1 条题解

  • 0
    @ 2026-8-31 21:26:16

    没看懂啥意思。

    #include<bits/stdc++.h>
    using namespace std;
    #define int unsigned long long
    const int N=110;
    int dp[N],cnt[N],pre[N],g[N];
    char s[N];
    void solve()
    {
    	int n,m;cin>>n>>m;
    	memset(cnt,0,sizeof(cnt));
    	cout<<dp[n]<<'\n';
    	s[n+1]=0,g[1]=1;s[1]='a';
    	if(m>(dp[n]>>1))s[1]='b',m-=(dp[n]>>1);
    	for(int i=2,pos;i<=n;i++)
    	{
    		s[i]='a',pos=0;
    		for(int j=2;j<=i;j++)
    		{
    			while(pos&&s[pos+1]!=s[j])pos=pre[pos];
    			if(s[pos+1]==s[j])pos++;
    			pre[j]=pos,g[j]=!pos;
    		}
    		for(;pos;pos=pre[pos])cnt[pos]=i;
    		for(int j=i+1;j<=n;j++)
    		{
    			g[j]=1ull<<(j-i);
    			for(int k=1;k*2<=j;k++)
    			{
    				if(k>=i)g[j]-=g[k]*(1ull<<(j-k*2));
    				else if(k<=j-i)g[j]-=g[k]*(1ull<<(j-i-k));
    				else if(cnt[k+i-j]==i)g[j]-=g[k];
    			}
    		}
    		if(g[n]<m)s[i]='b',m-=g[n];
    	}
    	printf("%s\n",s+1);
    }
    signed main()
    {
    	for(int i=1;i<=64;i++)
    	{
    		if(i!=64)dp[i]=(1ull<<i);
    		for(int j=1;j*2<=i;j++)
    			dp[i]-=dp[j]*(1ull<<(i-j*2));
    	}
    	int t;cin>>t;
    	while(t--)solve();
    	return 0;
    }

    信息

    ID
    6523
    时间
    1000ms
    内存
    512MiB
    难度
    10
    标签
    递交数
    5
    已通过
    3
    上传者