洛咕原题

题解

状压dp+矩乘

首先看到题目说M<=5,这么小的数据明显可以用状压保存相邻状态,于是可以得到一个80分的dp:

先筛出所有可用的状态,然后建立一个矩阵保存可转移的状态,再然后把每个状态都当成最初状态各跑一次dp,累计答案

然而我们发现,n太大了。又发现,其实每次转移可以直接用矩乘来搞(用到了状态矩阵)

于是就用矩乘了。嗯,就这样,具体看题解吧。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
const int mod=;
ll n,ans;
int m,k,cnt;
int state[];
struct matrix{
int a[][];
matrix(){memset(a,,sizeof(a));}
matrix operator * (matrix &tmp){
matrix c;
for(int i=;i<=cnt;++i)
for(int j=;j<=cnt;++j)
for(int k=;k<=cnt;++k)
c.a[i][j]=(ll)(c.a[i][j]+(ll)a[i][k]*tmp.a[k][j]%mod)%mod;
return c;
}
matrix ksm(matrix x,ll y){
matrix ans;
for(int i=;i<=cnt;++i) ans.a[i][i]=;
for(;y;y>>=){
if(y&) ans=ans*x;
x=x*x;
}
return ans;
}
}st,mul; int main(){
scanf("%lld%d%d",&n,&m,&k);
for(int i=(<<m)-;i>=;--i){
int t=;
for(int j=i;j;j>>=) t+=(j&);
if(t<=k) state[++cnt]=i;
} //筛出可用状态
for(int i=;i<=cnt;++i)
for(int j=;j<=cnt;++j)
{
int x=state[i],y=state[j]>>,ok=;
for(int k=m-;k;--k){
if((x&)!=(y&)) {ok=; break;}
x>>=; y>>=;
}
mul.a[i][j]=ok;
} //可转移状态矩阵
for(int i=;i<=cnt;++i) st.a[i][i]=;
mul=mul.ksm(mul,n);
st=st*mul;
for(int i=;i<=cnt;++i) ans=(ans+st.a[i][i])%mod; //累计矩阵对角线上的答案
printf("%lld",ans);
return ;
}

P1357 花园的更多相关文章

  1. 洛谷 P1357 花园 解题报告

    P1357 花园 题目描述 小\(L\)有一座环形花园,沿花园的顺时针方向,他把各个花圃编号为\(1~N(2<=N<=10^{15})\).他的环形花园每天都会换一个新花样,但他的花园都不 ...

  2. 题解:洛谷P1357 花园

    题解:洛谷P1357 花园 Description 小 L 有一座环形花园,沿花园的顺时针方向,他把各个花圃编号为 \(1∼n\).花园 \(1\) 和 \(n\) 是相邻的. 他的环形花园每天都会换 ...

  3. 洛谷P1357 花园(状态压缩 + 矩阵快速幂加速递推)

    题目链接:传送门 题目: 题目描述 小L有一座环形花园,沿花园的顺时针方向,他把各个花圃编号为1~N(<=N<=^).他的环形花园每天都会换一个新花样,但他的花园都不外乎一个规则,任意相邻 ...

  4. P1357 花园 状压 矩阵快速幂

    题意 小L有一座环形花园,沿花园的顺时针方向,他把各个花圃编号为1~N(2<=N<=10^15).他的环形花园每天都会换一个新花样,但他的花园都不外乎一个规则,任意相邻M(2<=M& ...

  5. [洛谷P1357] 花园

    题目类型:状压\(DP\) -> 矩阵乘法 绝妙然而思维难度极其大的一道好题! 传送门:>Here< 题意:有一个环形花圃,可以种两种花:0或1. 要求任意相邻的\(M\)个花中1的 ...

  6. luogu P1357 花园

    传送门 先考虑朴素dp,设\(f_{i,j}\)表示推了\(i\)次,前\(m\)个点的状态为二进制数\(j\)(这里记放C为1),转移的时候枚举下一位放什么,还要考虑是否满足C的个数\(\leq k ...

  7. 【洛谷】P1357 花园(状压+矩阵快速幂)

    题目 传送门:QWQ 分析 因为m很小,考虑把所有状态压成m位二进制数. 那么总状态数小于$ 2^5 $. 如果状态$ i $能转移到$ j $,那么扔进一个矩阵,n次方快速幂一下. 答案是对角线之和 ...

  8. P1357 花园 (矩阵快速幂+ DP)

    题意:一个只含字母C和P的环形串 求长度为n且每m个连续字符不含有超过k个C的方案数 m <= 5  n <= 1e15 题解:用一个m位二进制表示状态 转移很好想 但是这个题是用矩阵快速 ...

  9. 洛谷 P1357 花园

    题意简述 一个只含字母C和P的环形串 求长度为n且每m个连续字符不含有超过k个C的方案数 题解思路 由于\(m<=5\)所以很显然状压 但由于\(n<=10^{15}\).可以考虑用矩阵加 ...

随机推荐

  1. openshift 配置ldap认证

    master主配置文件: ...... identityProviders: - challenge: true login: true mappingMethod: claim name: Ldap ...

  2. 如何解决gerrit代码冲突

    日常开发中,我们存在多人开发和同一个人提交多次记录的情况,这就避免不了代码冲突的情况出现. 下面介绍几种gerrit提交失败的现象,后续会根据大家遇到的情况,持续更新. 注意:出现合入不了,显示“ca ...

  3. jmeter压测之 监控--nmon

    压测方法整理: 1.     写jmx脚本,整理csv数据文件: 2.     部署测试环境,把jmx和csv放在压测机,把监控脚本nmon放被压测机: 3.     安装nmon: a.     w ...

  4. composer----------composer基本命令和遇到一些问题解决方案

    1.composer跟xdebug有冲突,每次用composer命令的时候都要报xdebug的错误,去php的配置文件里面将xdebug注释掉就可以了,但是我注释掉了以后还是不行.找了半天才看到,我用 ...

  5. linux 下安装mysql-5.7.12-1.el6.x86_64.rpm-bundle.tar

    -rw-rw-r--. hadoop hadoop Nov : mysql--.el6.x86_64.rpm-bundle.tar tar -xvf mysql-5.7.12-1.el6.x86_64 ...

  6. HAProxy实现mysql负载均衡

    安装 yum install haproxy 修改配置 vi /etc/haproxy/haproxy.cfg   配置如下 global daemon nbproc 1 pidfile /var/r ...

  7. django admin 处理文本换行空格

    使用 linebreaks filter <p>{{ blogpassage.content|linebreaksbr }}<p>

  8. python 将word另存为txt

      import os import os.path from win32com import client as wc c=[] rootdir=["d:/77"] #以该路径为 ...

  9. Echo团队团队展示

    班级:软件工程1916|W 作业:团队作业第一次-团队展示 团队名称:Echo 课程目标:展示团队 成员信息 队员学号 队员姓名 个人博客地址 备注 221600418 黄少勇 http://www. ...

  10. 浏览器页面请求js、css大文件处理

    当页面引用一个比较大的js和css文件时,会出现较大下载延迟,占用带宽的问题,如果一个应用里有很多这样的js或CSS文件,那么就需要优化了. 比如ext-all.js有1.4M,页面引用这个文件,正常 ...