【BZOJ5082】弗拉格

Description

“如果明天进了面试,我就去爆妹子的照”——有妹子的丁相允作为一个oier,自然不能立太多flag,让我们来看一道和flag有关的题目吧
给你n个flag,你要把每个染色成红黑白黄四色之一,满足:
1.相邻旗不能同色
2.白不能和黄相邻,红不能和黑相邻
3.不能存在连续三个球依次是“黑白红”或“红白黑”
4.翻转后相等视为等价
设不等价方案数为f(n),给定l,r,求Sigmaf(i),其中L<=i<=R模1000000007

Input

输入两个数l,r
l, r ≤ 10^9

Output

输出答案

Sample Input

3 4

Sample Output

23

题解:题中所给的条件不难令人想到矩乘。用v[a][b]表示最后一个颜色是a,倒数第二个颜色是b的方案数,然后根据前3个要求手动构建转移矩阵即可。

那第4个要求怎么办呢?我们直接将总方案数/2,但是一个回文串翻转过来和自身相等,不应该/2,所以我们还需加上回文串的个数。并且长度为偶数的回文串显然不满足条件1,所以我们只需要统计出所有长度为奇数的回文串,其数量=所有长度为(n+1)/2的串的个数。

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
typedef long long ll;
const ll P=1000000007;
struct M
{
ll v[17][17];
M() {memset(v,0,sizeof(v));}
ll* operator [] (int a) {return v[a];}
M operator * (const M &b) const
{
M c;
int i,j,k;
for(i=0;i<=16;i++) for(j=0;j<=16;j++) for(k=0;k<=16;k++) c.v[i][j]=(c.v[i][j]+v[i][k]*b.v[k][j])%P;
return c;
}
}S1,S2,T;
void pm(ll y1,ll y2)
{
while(y1||y2)
{
if(y1&1) S1=S1*T;
if(y2&1) S2=S2*T;
T=T*T,y1>>=1,y2>>=1;
}
}
//0白1红2黑3黄 inline ll calc(ll n)
{
if(!n) return 0;
if(n==1) return 4;
if(n==2) return 8;
int i,j,k;
T=S1=S2=M();
for(i=0;i<4;i++) for(j=0;j<4;j++) if(i!=j&&i+j!=3)
{
for(k=0;k<4;k++) if(j!=k&&j+k!=3&&!(i==2&&j==0&&k==1)&&!(i==1&&j==0&&k==2))
T[i*4+j][j*4+k]=1,T[i*4+j][16]++;
S1[0][i*4+j]=S2[0][i*4+j]=1;
}
T[16][16]=1;
S1[0][16]=S2[0][16]=8;
pm(n-2,(n+1)/2-2);
return ((S1[0][16]+S2[0][16]+P)%P*500000004+4)%P;
}
int main()
{
ll l,r;
scanf("%lld%lld",&l,&r);
printf("%lld",(calc(r)-calc(l-1)+P)%P);
return 0;
}

【BZOJ5082】弗拉格 矩阵乘法的更多相关文章

  1. BZOJ 5082: 弗拉格 矩阵乘法

    如果单点而不是求 sigma 的话还是比较好办的. 遇到这种前缀和相减的矩阵乘法可以增设一个 0 使得后面的能先加到前面,然后再算. 这样的话可以使的最后算出的是前缀和相加的形式. code: #in ...

  2. *HDU2254 矩阵乘法

    奥运 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submissi ...

  3. *HDU 1757 矩阵乘法

    A Simple Math Problem Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  4. CH Round #30 摆花[矩阵乘法]

    摆花 CH Round #30 - 清明欢乐赛 背景及描述 艺术馆门前将摆出许多花,一共有n个位置排成一排,每个位置可以摆花也可以不摆花.有些花如果摆在相邻的位置(隔着一个空的位置不算相邻),就不好看 ...

  5. POJ3070 Fibonacci[矩阵乘法]

    Fibonacci Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13677   Accepted: 9697 Descri ...

  6. bzoj 2738 矩阵乘法

    其实这题跟矩阵乘法没有任何卵关系,直接整体二分,用二维树状数组维护(刚刚学会>_<),复杂度好像有点爆炸(好像有十几亿不知道是不是算错了),但我们不能怂啊23333. #include&l ...

  7. 【BZOJ-2476】战场的数目 矩阵乘法 + 递推

    2476: 战场的数目 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 58  Solved: 38[Submit][Status][Discuss] D ...

  8. 【BZOJ-1898】Swamp 沼泽鳄鱼 矩阵乘法

    1898: [Zjoi2005]Swamp 沼泽鳄鱼 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1012  Solved: 566[Submit][S ...

  9. 【Codeforces718C】Sasha and Array 线段树 + 矩阵乘法

    C. Sasha and Array time limit per test:5 seconds memory limit per test:256 megabytes input:standard ...

随机推荐

  1. java-JSP脚本的9个内置对象

    http://blog.csdn.net/titilover/article/details/6800782 http://www.importnew.com/19128.html http://ww ...

  2. 关于Cocos2d-x中UI按钮的定义

    1.要有两张不同状态的图片 2.定义一个MenuItemSprite的实例,把这两张图的Sprite实例放进MenuItemSprite的实例 3.把MenuItemSprite的实例放进Menu实例 ...

  3. Android代码的几点小技巧

     1)View的状态保存与恢复dispatchRestoreInstanceStateonRestoreInstanceStateonSaveInstanceState 2)Service的前台服务使 ...

  4. 以下哪个Hibernate主键生成策略是实现主键按数值顺序递增的?

    A.increment B.identity C.sequence D.native 解答:A

  5. Javascript 严格模式 strict mode(转)

    一.概述 除了正常运行模式,ECMAscript 5添加了第二种运行模式:"严格模式"(strict mode).顾名思义,这种模式使得Javascript在更严格的条件下运行. ...

  6. 【Java面试题】56 在JAVA中如何跳出当前的多重嵌套循环?

    在Java中,要想跳出多重循环,可以在外面的循环语句前定义一个标号,然后在里层循环体的代码中使用带有标号的break 语句,即可跳出外层循环.例如, public class xunhuan { pu ...

  7. .net FrameWork各个版本之间的发展[转]

    上个星期看到了.NET 4.0框架退休日期逐渐临近文章,发现自己一直在使用NET  FrameWork,身为一个NET程序员,里面大概的区别自己还是知道的,但是自己要说出个所以然来了,发现还是有点力不 ...

  8. myEclipse svn 插件安装

    MyEclipse6.0 安装svn插件 博客分类: 技术   只说一种在线安装流程: 1. 打开Myeclipse,在菜单栏中选择Help→Software Updates→Find and Ins ...

  9. mysql数据库,如何在登录mysql之后执行操作系统上的SQL脚本?

    需求描述: 通过mysql客户端登录到mysql数据库,如何执行操作系统上的SQL脚本文件呢? 操作过程: 1.编写测试脚本文件 [mysql@redhat6 scripts]$ cat SeCoun ...

  10. oracle 日期函数 求年的最后一天、第一天,月的最后一天

    add_months(trunc(to_date('2013','yyyy') ,'yyyy'),12)-1  2013年最后一天 trunc(to_date('2013','yyyy') ,'yyy ...