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 ...
随机推荐
- 高仿微信实现左滑显示删除button功能
在实际项目中删除列表中的某一项是很常见的功能.传统的做法能够使用长按监听器等,而如今流行的做法是左滑弹出删除button,微信,QQ等都是这么做的,以下做一个演示样例,代码例如以下: 主页面MainA ...
- SQL模糊查询碰到空值怎么办?
作者:iamlaosong SQL查询语句用%来做模糊查询.程序中一般要求用户输入部分信息,依据这个信息进行模糊查询. 比如用户输入340104,以下这条语句就是查询昨天客户代码为340104开头的全 ...
- python xmlrpc
rpc 协议 RPC = Remote Procedure Call Protocol,即远程过程调用协议. xml rpc 协议 使用http协议作为传输协议,使用xml文本传输命令和数据的一种协议 ...
- 【读后感】Netty 系列之 Netty 高性能之道 - 相比 Mina 怎样 ?
[读后感]Netty 系列之 Netty 高性能之道 - 相比 Mina 怎样 ? 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商 ...
- WEBGIS控制图层的显示
看别人搞的GIS应用,常常有勾选.取消某个图层的操作,然后地图上就有相应的图形显隐,觉得好酷. 咋实现的? 其实说起来好像也不是特别复杂.在WEB端,实现该功能的原理和步骤是: 1.WEB端加载地图服 ...
- poj3349(hash or violence)
Snowflake Snow Snowflakes Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 38600 Accep ...
- Hibernate commit() 和flush() 的区别
<<精通Hibernate java对象持久化技术详解>> ,flush()方法进行清理缓存的操作,执行一系列的SQL语句,但不会提交事务;commit()方法会先调用flus ...
- 微信小程序 新手入门教程
因为工作需要,最近学习了一下微信小程序,在此分享一下大概的流程. 强烈建议大家先去看微信小程序简易教程:点我进入 起步: 安装微信web开发软件者工具,需要破解的同学可以网上找破解教程,很简单的,这里 ...
- ssm使用velocity模板语言
1.在pom.xml里添加velocity模板语言支持的依赖 <!-- velocity模板语言支持包 --> <dependency> <groupId>org. ...
- SpringBoot快速HelloWorld入门
1.新建maven项目 2.pom.xml 里添加SpringBoot所依赖的jar包 <parent> <groupId>org.springframework.boot&l ...