这题真神。。。

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

然后对于一段长度为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. cxLookupCombobox的多字段模糊匹配

    查了网上很多资料,懒人输入:通过程序使用过滤对话达到自己的目的: 用到cxFilter单元: cbb_DoctorOrder.Properties.View.DataController.Filter ...

  2. BZOJ:[JSOI2009]游戏Game【二分图匹配乱搞】

    题目大意:n*m的棋盘,其中有些区域是禁区,两个人在棋盘上进行博弈,后手选择棋子的初始位置,然后先后手轮流将棋子往上下左右移动,走过的区域不能再走,问能否有一个位置使得后手必胜 Input 输入数据首 ...

  3. Codeforces474E - Pillars

    Portal Description 给出一个\(n(n\leq10^5)\)的正整数序列\(\{a_n\}(a_i\leq10^{15})\)和正整数\(d(d\leq10^9)\),求\(\{a_ ...

  4. hdu 1564水题Play a game

    #include<stdio.h> int main() {  int n;  while(scanf("%d",&n),n) {   n=n*n-1;   i ...

  5. To_Date函数用法

    spl> select * from emp          where dates          between          to_date('2007-06-12 10:00:0 ...

  6. mapStruct笔记

    背景 mapStruct 是一个方便对象转换的工具,类似的工具还有 Dozer, BeanUtils. 实现 mapStruct的核心是在编译期生成基于转换规则的 Impl 文件,运行时直接调用 Im ...

  7. [Vijos] 天才的记忆

    背景 神仙飞啊飞 描述 从前有个人名叫W and N and B,他有着天才般的记忆力,他珍藏了许多许多的宝藏.在他离世之后留给后人一个难题(专门考验记忆力的啊!),如果谁能轻松回答出这个问题,便可以 ...

  8. 51nod1184 第N个质数

    如题.$n \leq 1e9$. 方法零:二分,然后洲阁筛.要魔改一下的洲阁筛.跑得慢.卡卡能过.没意思. //#include<iostream> #include<cstring ...

  9. POJ3233:Matrix Power Series

    对n<=30(其实可以100)大小的矩阵A求A^1+A^2+……+A^K,K<=1e9,A中的数%m. 从K的二进制位入手.K分解二进制,比如10110,令F[i]=A^1+A^2+……+ ...

  10. ES6__函数的扩展

    /** * 函数的扩展 * 1 为函数参数指定默认值 * 2 函数的 rest 参数 * 3 箭头函数 */ // ------------------------------------------ ...