hiho1605 - 递推+1000000000=矩阵快速幂
题目大意
小Hi最近对生成树(包含所有顶点的联通无环子图。)非常的感兴趣,他想知道对于特定的简单平面无向图是不是存在求生成树个数的简单方法。
小Hi定义了这样的图:一个以{0,1,2……n}为顶点的图,顶点0与其他n个顶点直接相连,对于顶点i(1 ≤ i < n),顶点i与顶点i+1连有一条边。下面是小Hi画的图n=4的图:

请求出对于任意n,这样的图的生成树个数。
输入
多组数据,每组数据一行,包括一个整数n
30%的数据(1 ≤ n ≤ 100),组数不超过10组
70%的数据(1 ≤ n ≤ 1000000),组数不超过10组
100%的数据(1 ≤ n ≤ 1000000000),组数不超过10组
输出
每组数据输出一个行包括一个整数,代表了图的生成树个数(对1000000007取模)。
------------------------------------------------------------------------------------------------------------------------------
开始找错了规律,如下图,以为每加一就翻倍,却忘记了右边红框中的两种情况。

唉,考虑问题不全面。
正确的递推公式为:
令:
F(i,0) 为i是孤立的或者(仅与i-1相连)。
F(i,1) 为包括i在内的点全部联通
则
F(i+1,1) = F(i,1)*2 + F(i,0);
F(i+1,0) = F(i,1) + F(i,0);
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
#define MOD 1000000007 struct Mat{
LL data[][];
static Mat unit(){
Mat mat;
mat.data[][]=mat.data[][]=mat.data[][]=;
mat.data[][]=;
return mat;
}
static Mat eye(){
Mat mat;
mat.data[][] = mat.data[][] = ;
return mat;
}
Mat(){ data[][]=data[][]=data[][]=data[][]=; }
Mat operator* (const Mat& another) const{
Mat ret;
ret.data[][]=(data[][]*another.data[][]%MOD+data[][]*another.data[][]%MOD)%MOD;
ret.data[][]=(data[][]*another.data[][]%MOD+data[][]*another.data[][]%MOD)%MOD;
ret.data[][]=(data[][]*another.data[][]%MOD+data[][]*another.data[][]%MOD)%MOD;
ret.data[][]=(data[][]*another.data[][]%MOD+data[][]*another.data[][]%MOD)%MOD;
return ret;
}
}; LL pown(int n){
Mat unit = Mat::unit();
Mat ret = Mat::eye();
while(n){
if(n&) ret = ret * unit;
n>>=; unit = unit * unit;
}
return (ret.data[][]+ret.data[][])%MOD;
} int main(){
int n;
while(scanf("%d",&n)!=EOF){
if(n==) puts("");
else{
printf("%lld\n",pown(n-));
}
}
return ;
}
hiho1605 - 递推+1000000000=矩阵快速幂的更多相关文章
- [HDOJ2604]Queuing(递推,矩阵快速幂)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2604 递推式是百度的,主要是练习一下如何使用矩阵快速幂优化. 递推式:f(n)=f(n-1)+f(n- ...
- hihoCoder 1143 : 骨牌覆盖问题·一(递推,矩阵快速幂)
[题目链接]:click here~~ 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 骨牌,一种古老的玩具.今天我们要研究的是骨牌的覆盖问题: 我们有一个2xN的长条形 ...
- HDU - 2604 Queuing(递推式+矩阵快速幂)
Queuing Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- HDU5950 Recursive sequence 非线性递推式 矩阵快速幂
题目传送门 题目描述:给出一个数列的第一项和第二项,计算第n项. 递推式是 f(n)=f(n-1)+2*f(n-2)+n^4. 由于n很大,所以肯定是矩阵快速幂的题目,但是矩阵快速幂只能解决线性的问题 ...
- hdu 5950 Recursive sequence 递推式 矩阵快速幂
题目链接 题意 给定\(c_0,c_1,求c_n(c_0,c_1,n\lt 2^{31})\),递推公式为 \[c_i=c_{i-1}+2c_{i-2}+i^4\] 思路 参考 将递推式改写\[\be ...
- [题解][SHOI2013]超级跳马 动态规划/递推式/矩阵快速幂优化
这道题... 让我见识了纪中的强大 这道题是来纪中第二天(7.2)做的,这么晚写题解是因为 我去学矩阵乘法啦啦啦啦啦对矩阵乘法一窍不通的童鞋戳链接啦 层层递推会TLE,正解矩阵快速幂 首先题意就是给你 ...
- HDU-6185-Covering(推递推式+矩阵快速幂)
Covering Time Limit: 5000/2500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- hdu 6185 递推+【矩阵快速幂】
<题目链接> <转载于 >>> > 题目大意: 让你用1*2规格的地毯去铺4*n规格的地面,告诉你n,问有多少种不同的方案使得地面恰好被铺满且地毯不重叠.答案 ...
- 【图灵杯 F】一道简单的递推题(矩阵快速幂,乘法模板)
Description 存在如下递推式: F(n+1)=A1*F(n)+A2*F(n-1)+-+An*F(1) F(n+2)=A1*F(n+1)+A2*F(n)+-+An*F(2) - 求第K项的值对 ...
随机推荐
- 基于Redis实现分布式应用限流--转
原文地址:https://my.oschina.net/giegie/blog/1525931 摘要: 限流的目的是通过对并发访问/请求进行限速或者一个时间窗口内的的请求进行限速来保护系统,一旦达到限 ...
- css盒模型:BFC、IFC边距重叠解决方案
BFC:块级格式化上下文 IFC:行内格式化上下文 实例如下: <div class="out" style="background: red;"> ...
- QQ自动登录里的一些控件知识
在这个程序里面有个读取计算机指定文件的知识: private void button2_Click(object sender, EventArgs e) { openFileDialog1.Show ...
- call使用场景
在javascript OOP中,定义: function cat(){ } cat.prototype={ food:"fish", say: funct ...
- Python——微信数据分析
数据可视化:http://echarts.baidu.com/echarts2/doc/example.html import refrom wxpy import *import jiebaimpo ...
- sed将上下两行并列
#cat log5 mmmm 1234 nnnn 2344 #sed -n '{N;s/\n/\t/p}' log5 mmmm 1234 nnnn 2344
- Extjs win
//创建window var win = Ext.create("Ext.window.Window", { id: "myWin", title: " ...
- composer install或者update 出错
composer install或者update 出错Your requirements could not be resolved to an installable set of package ...
- [LUOGU]2016 Sam数
我本来想看看SAM,就看见了这个.. 这道题很容易让人想到数位DP,用\(f[i][j]\)表示考虑到第\(i\)位,最后一位是\(j\)的方案数.看到1e18,直接矩阵快速幂加速,因为它每位转移都是 ...
- js如何实现php的in_array()
var arr = [ 4, "Pete", 8, "John" ]; jQuery.inArray("John", arr); //3 j ...