这题真神。。。

首先看到这么花里胡哨的题面眉头一皱就发现这个球的大小是搞笑的不然就没法做了,有用的是最终拆出来的长度

然后对于一段长度为n有n-1个丝状物的东西,写一个DP:f[i][2]表示枚举到第i个丝状物,当前断不断

那f[i][0]=f[i-1][1] f[i][1]=f[i-1][0]+f[i-1][1]=f[i-2][1]+f[i-1][1] 最终答案是f[n-1][1],把[1]去掉就是一个斐波那契数列

设c[n]表示长度为n一共构成的方案数,c[n]=fib[n-1]

那么题意转化为给你一个序列,分成若干段,求∑fib[(∑di)-1]  di是每一段表示的数字

fib肯定是要用矩阵乘法求的了,那么相当于求∑A * (M^(∑di)-2)) =A * (∑M^(∑di)) * (M^-2) 注意这里(M^-2)不能放在前面,矩乘没有交换律

要算的就是∑M^(∑di)=∑∑M^di(分配律),我们发现di实在是太大了,假如一次都不分割可以到1000位

我们把d的每一个十进制位拆出来,∑∑M^di=∑∑M^(∑ai*mj) 其中ai表示d的从左到右第i位的数字,mj是10^j,j表示i在d中是从右往左的第j+1位

再开出来∑∑M^(∑ai*mj)=∑∑∑(M^mj)^ai,M^mj可以预处理,设为gj的话原式=∑∑∑gj^ai

整理一下,现在的做法是枚举每一个状态,枚举这个状态的每一个段,枚举这个状态的每一个位把它的贡献加上

但是状态实在是太多了!我们必须再优化

设fi表示前i个细胞已经分好了上面那坨东西的和,因为有分配律所以我们可以先把不同状态当前的和先加起来

对于转移 fi=∑fj* c(j+1,i) 其中c(j+1,i)表示j+1~i变成一个段对答案的贡献,其实就是∑gj^ai嘛

直接这样做是n^3的,但是反过来for就可以把后面那个∑消掉

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;
const int maxn=;
const LL mod=1e9+; struct Matrix
{
LL mp[][];
void clear(){memset(mp,,sizeof(mp));}
void init(){clear();mp[][]=;mp[][]=;}
friend Matrix operator +(Matrix a,Matrix b)
{
Matrix c;c.clear();
for(int i=;i<=;i++)
for(int j=;j<=;j++)
c.mp[i][j]=(a.mp[i][j]+b.mp[i][j])%mod;
return c;
}
friend Matrix operator *(Matrix a,Matrix b)
{
Matrix c;c.clear();
for(int i=;i<=;i++)
for(int j=;j<=;j++)
for(int k=;k<=;k++)
c.mp[i][j]=(c.mp[i][j]+a.mp[i][k]*b.mp[k][j])%mod;
return c;
}
friend Matrix operator ^(Matrix a,int p)
{
Matrix c;c.init();
while(p!=)
{
if(p%==)c=c*a;
a=a*a;p/=;
}
return c;
}
}mi[maxn];//fib矩阵的10^k char ss[maxn];
int a[maxn];Matrix f[maxn],s;
int main()
{
mi[].mp[][]=,mi[].mp[][]=;
mi[].mp[][]=,mi[].mp[][]=;
for(int i=;i<=;i++)mi[i]=mi[i-]^; mi[].mp[][]=mod-,mi[].mp[][]=;
mi[].mp[][]=,mi[].mp[][]=;//fib逆运算 mi[].mp[][]=,mi[].mp[][]=;//A //.......init............ int n;
scanf("%d",&n);
scanf("%s",ss+);
for(int i=;i<=n;i++)a[i]=ss[i]-'';
f[].init();
for(int i=;i<=n;i++)
{
s.init();
for(int j=i-;j>=;j--)
{
s=s*(mi[i-j-]^a[j+]);
f[i]=f[i]+f[j]*s;
}
}
f[n]=mi[]*f[n]*mi[]*mi[];
printf("%lld\n",f[n].mp[][]); return ;
}

bzoj2323: [ZJOI2011]细胞的更多相关文章

  1. 【BZOJ 2323】 2323: [ZJOI2011]细胞 (DP+矩阵乘法+快速幂*)

    2323: [ZJOI2011]细胞 Description 2222年,人类在银河系外的某颗星球上发现了生命,并且携带了一个细胞回到了地球.经过反复研究,人类已经完全掌握了这类细胞的发展规律: 这种 ...

  2. [ZJOI2011]细胞——斐波那契数列+矩阵加速+dp

    Description bzoj2323 Solution 题目看起来非常复杂. 本质不同的细胞这个条件显然太啰嗦, 是否有些可以挖掘的性质? 1.发现,只要第一次分裂不同,那么互相之间一定是不同的( ...

  3. BZOJ 2323: [ZJOI2011]细胞

    嗯..csdn发得出markdown了..请移步~ 个人觉得那个帅一点 嗯 好题啊!! 矩乘+DP 蒟蒻的我一开始发现了斐波那契数列之后就不会搞了.. 那个..什么质量相同两种方案相同就是扯淡的..想 ...

  4. WC前的小计划

    写在前面的.. 要去WC了好开心的呢.. 但是之前荒废了好多时间呢.. 好吧从明天开始加紧训练,目标是:WC前bzoj300t..(现在是260呢..) 开始吧 来看看完成情况: 40/40 [201 ...

  5. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  6. #include <NOIP2009 Junior> 细胞分裂 ——using namespace wxl;

    题目描述 Hanks 博士是 BT (Bio-Tech,生物技术) 领域的知名专家.现在,他正在为一个细胞实 验做准备工作:培养细胞样本. Hanks 博士手里现在有 N 种细胞,编号从 1~N,一个 ...

  7. NOIP2009普及组细胞分裂(数论)——yhx

    题目描述 Hanks 博士是 BT (Bio-Tech,生物技术) 领域的知名专家.现在,他正在为一个细胞实 验做准备工作:培养细胞样本. Hanks 博士手里现在有 N 种细胞,编号从 1~N,一个 ...

  8. BZOJ2229: [Zjoi2011]最小割

    题解: 真是一道神题!!! 大家还是围观JZP的题解吧(网址找不到了...) 代码: #include<cstdio> #include<cstdlib> #include&l ...

  9. 【OpenCV】基于kmeans的细胞检测方法

    问题是这样的,有一幅经过二值化处理之后的图像,我们希望统计其中细胞的个数,和不同粘连情况的细胞个数,比如,下图中有1个细胞组成连通区域的,也有2个细胞组成连通区域的,也有更多个细胞组成连通区域的,我们 ...

随机推荐

  1. (二)java集合框架综述

    一集合框架图 说明:对于以上的框架图有如下几点说明 1.所有集合类都位于java.util包下.Java的集合类主要由两个接口派生而出:Collection和Map,Collection和Map是Ja ...

  2. POJ 2195 Going Home【最小费用流 二分图最优匹配】

    题目大意:一个n*m的地图,上面有一些人man(m)和数量相等的house(H) 图上的距离为曼哈顿距离 问所有人住进一所房子(当然一个人住一间咯)距离之和最短是多少? 思路:一个人一间房,明显是二分 ...

  3. SpringBoot自定义Filter

    SpringBoot自定义Filter SpringBoot自动添加了OrderedCharacterEncodingFilter和HiddenHttpMethodFilter,当然我们可以自定 义F ...

  4. 【2018 Multi-University Training Contest 3】

    01:https://www.cnblogs.com/myx12345/p/9420198.html 02: 03: 04:https://www.cnblogs.com/myx12345/p/940 ...

  5. 【ZJOI2017 Round1练习&BZOJ4767】D1T3 两双手(排列组合,DP)

    题意: 100%的数据:|Ax|,|Ay|,|Bx|,|By| <= 500, 0 <= n,Ex,Ey <= 500 思路:听说这是一道原题 只能往右或者下走一步且有禁止点的简化版 ...

  6. SeaJS项目完整实例【转】

    index.html——主页面. sea.js——SeaJS脚本. init.js——init模块,入口模块,依赖data.jquery.style三个模块.由主页面载入. data.js——data ...

  7. Minimum Spanning Tree.prim/kruskal(并查集)

    开始了最小生成树,以简单应用为例hoj1323,1232(求连通分支数,直接并查集即可) prim(n*n) 一般用于稠密图,而Kruskal(m*log(m))用于系稀疏图 #include< ...

  8. 使用 Apache Lucene 和 Solr 4 实现下一代搜索和分析

    使用 Apache Lucene 和 Solr 4 实现下一代搜索和分析 使用搜索引擎计数构建快速.高效和可扩展的数据驱动应用程序 Apache Lucene™ 和 Solr™ 是强大的开源搜索技术, ...

  9. 动态规划:HDU1087Super Jumping! Jumping! Jumping!(最大上升和)

    Problem Description Nowadays, a kind of chess game called “Super Jumping! Jumping! Jumping!” is very ...

  10. BZOJ——2697: 特技飞行

    http://www.lydsy.com/JudgeOnline/problem.php?id=2697 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: ...