1 条题解

  • 0
    @ 2026-7-4 11:17:51

    #include <cstdio>
    const int M = 100005;
    const int MOD = 1e9+1;
    int read()
    {
    	int x=0,f=1;char c;
    	while((c=getchar())<'0' || c>'9') {if(c=='-') f=-1;}
    	while(c>='0' && c<='9') {x=(x<<3)+(x<<1)+(c^48);c=getchar();}
    	return x*f;
    }
    int n,m,ans,vis[M],lim[M];
    int a[12][20],dp[12][1<<18],g[1<<18];
    void build(int x)
    {
    	for(int i=1;i<=11;i++)
    	{
    		if(i==1) a[1][1]=x;
    		else a[i][1]=a[i-1][1]*3;
    		if(a[i][1]>n) break;
    		m=i;vis[a[i][1]]=1;int cnt=1;
    		for(int j=2;j<=18;j++)
    		{
    			a[i][j]=a[i][j-1]*2;
    			if(a[i][j]>n) break;
    			vis[a[i][j]]=1;cnt=j;
    		}
    		lim[i]=1<<cnt;
    	}
    }
    int ask(int x)
    {
    	int res=0;
    	for(int i=0;i<lim[1];i++)
    		dp[1][i]=g[i];
    	for(int i=2;i<=m;i++) for(int j=0;j<lim[i];j++)
    	{
    		if(!g[j]) continue;dp[i][j]=0;
    		for(int k=0;k<lim[i-1];k++)
    			if(g[k] && (k&j)==0)
    				dp[i][j]=(dp[i][j]+dp[i-1][k])%MOD;
    	}
    	for(int i=0;i<lim[m];i++)
    		res=(res+dp[m][i])%MOD;
    	return res;
    }
    signed main()
    {
    	n=read();ans=1;
    	for(int i=0;i<(1<<18);i++)
    		g[i]=!((i<<1)&(i));
    	for(int i=1;i<=n;i++) if(!vis[i])
    		build(i),ans=1ll*ans*ask(i)%MOD;
    	printf("%d\n",ans);
    }
    
    
    • 1

    信息

    ID
    4399
    时间
    1000ms
    内存
    128MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者