51nod 算法马拉松18 B 非010串 矩阵快速幂
非010串
一个数n,表示长度。(n<1e15)
长度为n的非010串的个数。(对1e9+7取模)
3
7 解释:
000
001
011
100
101
110
111
读完题,这样的题目肯定是能找到规律所在的,要不然数据太大根本无法算。假设现在给的长度是n,答案为f(n),那么假设最后一位是0,前面有010的可能就有f(n-1)种,同样假设最后一位是1,前面有010的可能就也有f(n-1),而这样排除的话还存在着一个问题,就是最后为0的时候可能会出现前面是01而构成010,这样就加重复了。所以假设前一位为1,再减去f(n-2),当然还可能前面是11而构成110而不是010,所以还要把多减的再加回来,即再加上一个f(n-3),这样一来就可以推出一个公式,f(n)=2*f(n-1)-f(n-2)+f(n-3)。看到这个公式,数据有那么大,所以我们用矩阵快速幂来进行处理就可以快速得出结果了。
下面是AC代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; const long long mod=; struct matrix
{
long long a[][];
}; matrix cal(matrix A,matrix B)
{
int i,j,k;
matrix C;
for(i=;i<;i++)
{
for(j=;j<;j++)
{
C.a[i][j]=;
for(k=;k<;k++)
{
C.a[i][j]=(C.a[i][j]+(A.a[i][k]*B.a[k][j])%mod+mod)%mod;
}
}
}
return C;
} int out(matrix A,matrix B)
{
cout<<"s:"<<endl;
cout<<A.a[][]<<" "<<A.a[][]<<" "<<A.a[][]<<endl;
cout<<A.a[][]<<" "<<A.a[][]<<" "<<A.a[][]<<endl;
cout<<A.a[][]<<" "<<A.a[][]<<" "<<A.a[][]<<endl;
cout<<"base:"<<endl;
cout<<B.a[][]<<" "<<B.a[][]<<" "<<B.a[][]<<endl;
cout<<B.a[][]<<" "<<B.a[][]<<" "<<B.a[][]<<endl;
cout<<B.a[][]<<" "<<B.a[][]<<" "<<B.a[][]<<endl;
return ;
} matrix pow_mod(long long x)
{
matrix s,base;
base.a[][]=;
base.a[][]=-;
base.a[][]=;
base.a[][]=;
base.a[][]=base.a[][]=;
base.a[][]=;
base.a[][]=base.a[][]=;
s.a[][]=;
s.a[][]=;
s.a[][]=;
s.a[][]=s.a[][]=s.a[][]=;
s.a[][]=s.a[][]=s.a[][]=;
out(s,base);
while(x)
{
if(x&)
s=cal(s,base);
base=cal(base,base);
out(s,base);
x>>=;
}
return s;
} int main()
{
long long n;
long long ans;
while(scanf("%lld",&n)!=EOF)
{
if(n==)
cout<<<<endl;
else if(n==)
cout<<<<endl;
else if(n==)
cout<<<<endl;
else if(n==)
cout<<<<endl;
else
{
matrix t=pow_mod(n-);
ans=t.a[][]%mod;
cout<<ans<<endl;
/*cout<<t.a[0][1]%mod<<endl;
cout<<t.a[1][0]%mod<<endl;
cout<<t.a[1][1]%mod<<endl;*/
}
}
return ;
}
51nod 算法马拉松18 B 非010串 矩阵快速幂的更多相关文章
- 51nod 算法马拉松18 A 染色问题
染色问题 基准时间限制:1 秒 空间限制:10240 KB 分值: 40 一个n(3<=n<=100)个点的完全图,现在给出n,要求将每条边都染上一种颜色k(1<=k<=n), ...
- 51NOD 算法马拉松8
题目戳这里:51NOD算法马拉松8 某天晚上kpm在玩OSU!之余让我看一下B题...然后我就被坑进了51Nod... A.还是01串 水题..怎么乱写应该都可以.记个前缀和然后枚举就行了.时间复杂度 ...
- 51nod 算法马拉松 34 Problem D 区间求和2 (FFT加速卷积)
题目链接 51nod 算法马拉松 34 Problem D 在这个题中$2$这个质数比较特殊,所以我们先特判$2$的情况,然后仅考虑大于等于$3$的奇数即可. 首先考虑任意一个点对$(i, j)$ ...
- 【BZOJ1009】GT考试(KMP算法,矩阵快速幂,动态规划)
[BZOJ1009]GT考试(KMP算法,矩阵快速幂,动态规划) 题面 BZOJ 题解 看到这个题目 化简一下题意 长度为\(n\)的,由\(0-9\)组成的字符串中 不含串\(s\)的串的数量有几个 ...
- 算法设计与分析 1.2 不一样的fibonacci数列 (矩阵快速幂思想)
题目描述 Winder 最近在学习 fibonacci 数列的相关知识.我们都知道 fibonacci 数列的递推公式是F(n) = F(n - 1) + F(n - 2)(n >= 2 且 n ...
- 51nod 1113 矩阵快速幂
题目链接:51nod 1113 矩阵快速幂 模板题,学习下. #include<cstdio> #include<cmath> #include<cstring> ...
- 题解-AtCoder-agc003F Fraction of Fractal(非矩阵快速幂解法)
Problem AtCoder-agc003F 题意:给出\(n\)行\(m\)列的01矩阵,一开始所有 \(1\) 连通,称此为\(1\)级分形,定义\(i\)级分形为\(i-1\)级分形中每个标示 ...
- 整数快速乘法/快速幂+矩阵快速幂+Strassen算法
快速幂算法可以说是ACM一类竞赛中必不可少,并且也是非常基础的一类算法,鉴于我一直学的比较零散,所以今天用这个帖子总结一下 快速乘法通常有两类应用:一.整数的运算,计算(a*b) mod c 二.矩 ...
- FZU2018级算法第一次作业 1.1fibonacci (矩阵快速幂)
题目 Winder最近在学习fibonacci 数列的相关知识.我们都知道fibonacci数列的递推公式是F(n)=F(n-1)+F(n-2)(n>=2 且n 为整数). Winder想知道的 ...
随机推荐
- delegate、notification、KVO场景差别
delegate: 编译器会给出没有实现代理方法的警告 一对一 使用weak而不是assign,或者vc消失时置为nil 可以传递参数,还可以接收返回值 notification: 编译期无法排错 一 ...
- Outlook HTML渲染引擎
OutLook始终不离不弃 是不是很讨厌为Email代码兼容Outlook? 太遗憾了!虽然光都有尽头,但Outlook始终存在. 为了应付Email的怪癖,我们花了很多时间测试,确保我们搞定了所有O ...
- LInux MySQL 端口验证
linux suse11在terminal可以正常登录进行各种操作,在tomcat运行jdbc web程序异常: com.mysql.jdbc.exceptions.jdbc4.Communicati ...
- 浏览器执行js代码的机制--对于我们深入了解js有很大的帮助,同时面试时候也都能用得到。
前端小菜又来了,这些天每天工作,晚上学习太累了.趁星期天给自己放个假.写完这个博客就要出去high了.鸡冻.接下来进入正题啦, 你可能要问,我们学习这个有什么用啊?这样我先给大家来个小小的面试题. a ...
- WCF学习之旅—WCF第二个示例(六)
第五步,创建数据服务 在“解决方案资源管理器”中,使用鼠标左键选中“SCF.WcfService”项目,然后在菜单栏上,依次选择“项目”.“添加新项”. 在“添加新项”对话框中,选择“Web”节点,然 ...
- Java基础-服务器的发送和接收
package hanqi.test; import java.io.IOException; import java.io.OutputStream; import java.io.PrintWri ...
- thinkPHP入门之二
thinkphp提供了很多便利的方法,因为php要记的东西太多了,而thinkphp极大简化了这些,让编写过程更加快速. 为了预防那些了解它的人胡乱玩耍,thinkphp提供一个函数_empty 它是 ...
- OpenCascade B-Spline Basis Function
OpenCascade B-Spline Basis Function eryar@163.com Abstract. B-splines are quite a bit more flexible ...
- sublime3破解版sublime3注册码
Sublime Text 3 官方网址:http://www.sublimetext.com/ Mac下载地址: http://c758482.r82.cf2.rackcdn.com/Sublime% ...
- 写给后端程序员的HTTP缓存原理介绍
There are only two hard things in Computer Science: cache invalidation and naming things. -- Phil Ka ...