HDU6050: Funny Function(推公式+矩阵快速幂)
传送门
题意
利用给出的式子求\(F_{m,1}\)
分析
直接推公式(都是找规律大佬)
\(n为偶数,F_{m,1}=\frac{2(2^n-1)^{m-1}}3\)
\(n为奇数,F_{m,1}=F_{m-1,1}(2^n-1)-\frac{2(4^{\frac n2}-1)}3\)
抱歉啊,markdown矩阵相乘实在调不出来了,勉强看一看吧QAQ
\(
\left[
\begin{matrix}
2^n-1&-1 \\
0&1
\end{matrix}
\right] \tag{3}
\)
\(
\left[
\begin{matrix}
F_{m-1,1} \\
\frac{2(4^{\frac n2}-1)}3
\end{matrix}
\right] \tag{3}
\) \(=\) \(
\left[
\begin{matrix}
F_{m,1}\\
\frac{2(4^{\frac n2}-1)}3
\end{matrix}
\right] \tag{3}
\)
做一次矩阵快速幂即可
trick
m为1,n为偶数直接输出1
代码
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define F(i,a,b) for(int i=a;i<=b;++i)
#define R(i,a,b) for(int i=a;i<b;++i)
#define mem(a,b) memset(a,b,sizeof(a))
const int N = 2;
const ll mod = 1e9+7;
int t;
ll n,m,n_2,n_4,ni_3;
struct matrix
{
ll mp[N][N];
matrix()
{
mem(mp,0);
}
};
ll pow_mod(ll a,ll p)
{
ll ans=1;
for(ll ret=a%mod;p;p>>=1,ret=ret*ret%mod) if(p&1) ans=ans*ret%mod;
return ans;
}
matrix mul(matrix a,matrix b)//矩阵相乘
{
matrix ans;
R(i,0,2)R(j,0,2)R(k,0,2) (ans.mp[i][j]+=a.mp[i][k]*b.mp[k][j]%mod)%=mod;
return ans;
}
matrix matrix_pow_mod(matrix a,ll p)
{
matrix ans,ret;
R(i,0,2)R(j,0,2) ret.mp[i][j]=a.mp[i][j];
ans.mp[0][0]=ans.mp[1][1]=1;
while(p)
{
if(p&1) ans=mul(ans,ret);
ret=mul(ret,ret);
//R(i,0,2)R(j,0,2) printf("%I64d%c", ret.mp[i][j],j==1?'\n':' ');
p>>=1;
}
return ans;
}
void init()
{
n_2=(pow_mod(2LL,(ll)n)-1+mod)%mod;//求2^n-1
n_4=(pow_mod(4LL,(ll)(n/2))-1+mod)%mod;//求4^n-1
ni_3=pow_mod(3LL,mod-2);//求3的逆元
n_4=n_4*2%mod*ni_3%mod;
}
void work1()
{
matrix temp,ret;
temp.mp[0][0]=n_2,temp.mp[0][1]=-1;
temp.mp[1][0]=0,temp.mp[1][1]=1;
ret=matrix_pow_mod(temp,(ll)(m-1));//矩阵快速幂
ll ans=0;
//R(i,0,2)R(j,0,2) printf("%I64d\n",ret.mp[i][j] );
ans=(ret.mp[0][0]+ret.mp[0][1]*n_4%mod+mod)%mod;
while(ans<0) ans+=mod;
printf("%I64d\n",ans );
}
void work2()
{
ll ans=pow_mod(n_2,(ll)(m-1));
ans=ans*2%mod*ni_3%mod;
ans=(ans+mod)%mod;
printf("%I64d\n",ans );
}
int main()
{
for(scanf("%d",&t);t--;)
//F(i,1,10)F(j,1,10)
{
scanf("%lld %lld",&n,&m);
//n=i,m=j;printf("n=%I64d m=%I64d\n",n,m );
init();
if(m==1) { puts("1");continue; }
if(n&1) work1();else work2();
}
return 0;
}
HDU6050: Funny Function(推公式+矩阵快速幂)的更多相关文章
- CCF 201312-4 有趣的数 (数位DP, 状压DP, 组合数学+暴力枚举, 推公式, 矩阵快速幂)
问题描述 我们把一个数称为有趣的,当且仅当: 1. 它的数字只包含0, 1, 2, 3,且这四个数字都出现过至少一次. 2. 所有的0都出现在所有的1之前,而所有的2都出现在所有的3之前. 3. 最高 ...
- hihoCoder 1143 : 骨牌覆盖问题·一(递推,矩阵快速幂)
[题目链接]:click here~~ 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 骨牌,一种古老的玩具.今天我们要研究的是骨牌的覆盖问题: 我们有一个2xN的长条形 ...
- [HDOJ2604]Queuing(递推,矩阵快速幂)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2604 递推式是百度的,主要是练习一下如何使用矩阵快速幂优化. 递推式:f(n)=f(n-1)+f(n- ...
- hdu 6185 递推+【矩阵快速幂】
<题目链接> <转载于 >>> > 题目大意: 让你用1*2规格的地毯去铺4*n规格的地面,告诉你n,问有多少种不同的方案使得地面恰好被铺满且地毯不重叠.答案 ...
- 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 ...
随机推荐
- weex 阶段总结
新年伊始,回顾过去的一年,收获很多,之前一直在研究weex,说心里话感觉心好累,官方文档不全,社区不活跃,遇到很多坑,官方发布的版本有时都有坑,搞得我都不敢更新版本了. 但是,研究了这么久,放弃太可惜 ...
- 【转载】高性能IO模型浅析
服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型. (2)同步非阻塞IO(Non-blocking IO):默认创建的s ...
- JavaScript 模拟键盘事件
JavaScript 模拟键盘事件和鼠标事件(比如模拟按下回车等) 2016年09月08日 15:23:25 神秘_博士 阅读数:41158 标签: javascript鼠标键盘事件模拟更多 个人分类 ...
- javascript 总结(持续更新)
1.jQuery对象转DOM对象. jQuery对象转DOM对象有两种方法,[index]和get(index). var $cr = $("#cr"); //jQuery对象 v ...
- 关闭SVN服务
关闭TSVNCache.exe进程 在Windows下使用SVN,通常都会安装TortoiseSVN,安装后会有一个TSVNCache.exe的进程驻留内存,这个进程会定时地去扫描Subversion ...
- MapReduce算法形式二:去重(shuffle)
案例二:去重(shuffle/HashSet等方法)shuffle主要针对的是key去重HashSet主要针对values去重
- Parallels Desktop 设置win网络连接
目的: 1 虚拟机中的win系统技能访问外网 2 可以和Mac系统互联 首先来实现1,很简单: 打开控制中心对应系统的设置 选择[硬件]->[网络] 源:设置共享网络 到此就达到1目的了: 现在 ...
- antV G6流程图在Vue中的使用
最近我司项目中需要加入流程图制作功能,于是乎百度各种找可视化绘制拓扑图的轮子,大部分都是国外的,看文档太吃力,不过好在最终让我发现了AntV G6流程图图表库,最新版为2.0,不过编辑器在2.0版本还 ...
- 装饰器模式(IO流案例)
装饰器模式,也成为包装模式,顾名思义,就是对已经存在的某些类进行装饰,以此来扩展一些功能.其结构图如下: Component为统一接口,也是装饰类和被装饰类的基本类型. ConcreteCompone ...
- 解决VMware安装Ubuntu的过程中窗口过小无法看到【下一步】按钮的问题
只要按住ALT键向上拖动窗口