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想知道的 ...
随机推荐
- Python 学习文章收藏
作者 标题 rollenholt Python修饰器的函数式编程 - Rollen Holt - 博客园 rollenholt python操作gmail - Rollen Holt - 博客园 ro ...
- shell使用攻略
shell 是什么 ~ $ ls /bin/*sh /bin/bash /bin/csh /bin/ksh /bin/sh /bin/tcsh /bin/zsh 是什么 kernel shell 命令 ...
- 当前不会命中断点。源代码与原始版本不同 (VS2012)
遇到“当前不会命中断点.源代码与原始版本不同”的问题. 在网上查的类似: 一般studio会提示将“工具”,“选项”,“调试”,“要求源文件与原始版本完成匹配”去掉勾.但是这个配置去掉治标不治本,错误 ...
- EditText中imeOptions属性使用及设置无效解决
虽然通常输入法软键盘右下角会是回车按键 但我们经常会看到点击不同的编辑框,输入法软键盘右下角会有不同的图标 点击浏览器网址栏的时候,输入法软键盘右下角会变成“GO”或“前往” 而我们点击Google搜 ...
- Sql Server系列:字符串函数
字符串函数用于对字符和二进制字符串进行各种操作,大多数字符串函数只能作用于char.nchar.varchar和nvarchar数据类型.字符串函数可以用在SELECT或者WHERE语句中. 1. A ...
- SQL Server游标
什么是游标 结果集,结果集就是select查询之后返回的所有行数据的集合. 游标则是处理结果集的一种机制吧,它可以定位到结果集中的某一行,多数据进行读写,也可以移动游标定位到你所需要的行中进行操作数据 ...
- 【转】WPF防止界面卡死并显示加载中效果
原文地址:http://www.cnblogs.com/linyijia/archive/2013/02/06/2900609.html <Window x:Class="Loadin ...
- 我被比特币撞了一下腰——记OKCoin试用体验
本博客还有大量的.NET开源技术文章,您可能感兴趣: 1.开源Math.NET基础数学类库使用系列文章:链接 2.开源C#彩票数据资料库系列文章:链接 3.开源的.NET平台ORM组件文章:链接 4. ...
- 基于Metronic的Bootstrap开发框架经验总结(5)--Bootstrap文件上传插件File Input的使用
Bootstrap文件上传插件File Input是一个不错的文件上传控件,但是搜索使用到的案例不多,使用的时候,也是一步一个脚印一样摸着石头过河,这个控件在界面呈现上,叫我之前使用过的Uploadi ...
- 【续集】在 IIS 中部署 ASP.NET 5 应用程序遭遇的问题
dudu 的一篇博文:在 IIS 中部署 ASP.NET 5 应用程序遭遇的问题 针对 IIS 部署 ASP.NET 5 应用程序的问题,在上面博文中主要采用两种方式尝试: VS2015 的 Publ ...