这题真神。。。

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

然后对于一段长度为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. Educational Codeforces Round 50 (Rated for Div. 2)的A、B、C三题AC代码

    A题链接:https://codeforces.com/contest/1036/problem/A A题AC代码: #include <stdio.h> #include <std ...

  2. DOS使用笔记

    DOS下cd命令: cd .. 上一级目录: g: 指定当期目录到G盘,而cd g:是没有效果的: 如图: 在安装Windows服务的过程中,如果installutil为64位版本,那么编译生成项目的 ...

  3. HDU 5421 Victor and String

    Victor and String Time Limit: 1000ms Memory Limit: 262144KB This problem will be judged on HDU. Orig ...

  4. rsync 同步文件重复拷贝问题

    rsync 是同步文件的利器,一般用于多个机器之间的文件同步与备份,同时也支持在本地的不同目录之间互相同步文件.在这种场景下,rsync 远比 cp 命令更加合适,它只会同步需要更新的文件,默认情况下 ...

  5. [luoguP2184] 贪婪大陆(树状数组)

    传送门 用两个树状数组,cr 维护 1....x 中 r 的数量 cl 维护 1....x 中 l 的数量 求答案的时候只需要求 y 前面 被作为左端点 的个数 - x 前面 被作为右端点的个数 —— ...

  6. 51nod1135 原根

    原根判定:$m>2$,$\varphi (m)$的不同素数是$q_1,q_2,……,q_s$,$(g,m)=1$,则$g$是$m$的一个原根的充要条件是$g^{\frac{\varphi(m)} ...

  7. msp430项目编程16

    msp430中项目---电子秒表 1.定时器工作原理 2.电路原理说明 3.代码(显示部分) 4.代码(功能实现) 5.项目总结 msp430项目编程 msp430入门学习

  8. webstorm初始化

    1.皮肤设置,重启后Terminal皮肤生效 2.排除目录 2.1全局排除 2.2局部排除 选中文件夹 右击Make Directroy As 选择 Excluded 3.代码自定义 3.1 cons ...

  9. java集合框架 hashMap 简单使用

    参考文章:http://blog.csdn.net/itm_hadf/article/details/7497462 通常,默认加载因子 (.75) 在时间和空间成本上寻求一种折衷.      加载因 ...

  10. jmeter的jmx脚本结构解析

    jmeter的jmx脚本是xml文档,简单分析下其结构 xml是树形结构:jmeter界面的树形结构就是xml的结构 一级目录: 二级目录:在一级目录右键后可以看到的,都可以做为二级目录 三级目录.n ...