• 【CF1152F】Neko Rules the Catniverse(动态规划)


    【CF1152F】Neko Rules the Catniverse(动态规划)

    题面

    CF

    题解

    我们先考虑一个需要扫一遍所有位置的做法。
    那么状态一定是(f[i])然后什么什么表示考虑到当前第(i)个位置的答案。
    看看我们还需要记录什么,首先肯定要记录的是当前已经选了几个,所以多了一维(j)
    然后考虑现在这个能不能选。
    首先如果这个元素放在某个元素之前,后面一定是合法的,因为当前位置一定是全局的最大值,所以只需要考虑它可以放在谁之前就行了。
    而限制是(xle y+m),那么我们暴力压状态记录前(m)个是否被选择。
    那么首先这个元素放在第一个一定是可以的,然后这个元素如果不放在第一个就要放在某一个的后面,那么就只有可能放在最后(m)个存在元素的后面,那么判断一下就行啦。
    然后发现转移是一模一样的,所以直接矩乘就行了。

    #include<iostream>
    #include<cstdio>
    using namespace std;
    #define MOD 1000000007
    void add(int &x,int y){x+=y;if(x>=MOD)x-=MOD;}
    inline int read()
    {
    	int x=0;bool t=false;char ch=getchar();
    	while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
    	if(ch=='-')t=true,ch=getchar();
    	while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
    	return t?-x:x;
    }
    int b[13][1<<4],bel[1<<4],n,K,m,N,ans;
    struct Matrix
    {
    	int s[210][210];
    	void clear(){for(int i=1;i<=N;++i)for(int j=1;j<=N;++j)s[i][j]=0;}
    	void init(){clear();for(int i=1;i<=N;++i)s[i][i]=1;}
    	int*operator[](int x){return s[x];}
    }A,Tr;
    Matrix operator*(Matrix &a,Matrix &b)
    {
    	Matrix c;c.clear();
    	for(int i=1;i<=N;++i)
    		for(int j=1;j<=N;++j)
    			for(int k=1;k<=N;++k)
    				c[i][j]=(c[i][j]+1ll*a[i][k]*b[k][j])%MOD;
    	return c;
    }
    int main()
    {
    	n=read();K=read();m=read();
    	for(int i=1;i<1<<m;++i)bel[i]=bel[i>>1]+(i&1);
    	for(int j=0;j<=K;++j)
    		for(int S=0;S<1<<m;++S)b[j][S]=++N;
    	for(int j=0;j<=K;++j)
    		for(int S=0;S<1<<m;++S)
    		{
    			int T=(S<<1)&((1<<m)-1);
    			add(Tr[b[j][S]][b[j][T]],1);
    			if(j<K)add(Tr[b[j][S]][b[j+1][T|1]],bel[S]+1);
    		}
    	A[1][1]=1;
    	while(n){if(n&1)A=A*Tr;Tr=Tr*Tr;n>>=1;}
    	for(int i=0;i<1<<m;++i)add(ans,A[1][b[K][i]]);
    	printf("%d
    ",ans);
    	return 0;
    }
    
  • 相关阅读:
    Hibernate HQL查询:
    Struts2里如何取得request,session,application
    Hibernate 报错org.hibernate.PropertyAccessException: IllegalArgumentException(已解决)
    PHP 读取文件的几种方法
    PHP 关于文件操作的简单介绍
    VB 中ListView 某一列的颜色添加不上去的解决方法
    SQL Server 版本号汇总
    C# 单元测试
    Web Api单元测试写法
    git bash 出现vim的时候怎么退出
  • 原文地址:https://www.cnblogs.com/cjyyb/p/10777908.html
Copyright © 2020-2023  润新知