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 ...
随机推荐
- windows10 開機失敗,且按F8無法進入安全模式
windows10 開機失敗,且按F8無法進入安全模式: 在cmd視窗下: bcdedit set {default} bootmenupolicy legacy 重啟,再按F8試一試吧! To En ...
- $.ajax里一个中文全角逗号引发的惨案
昨天,在制作一个页面时,突然发生一件不可思议的事情--JS失效了! 确实让人匪夷所思,我记得饭前还是正常运作的. 于是慢慢的缩小范围,把下午刚加的语句删掉,删完了页面就正常了. 于是被删除的这部分代码 ...
- ZT:150条毒鸡汤
1.照照镜子吧,还要什么段子? 2.多年过去,再回忆高考,其实本质上没有考到好与坏的说法,重要的是年轻人在一起,做份试题,然后决定去哪座城市做代购. 3.真正努力过的人,就会明白天赋的重要性. 4.转 ...
- Andriod 从源码的角度详解View,ViewGroup的Touch事件的分发机制
转自:xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/21696315) 今天这篇文章主要分析的是Android的事件分发机制, ...
- 关于OC的内存管理-01
1.什么是内存管理? 大家都知道手机的内存是有限的,app应用的内存也应该是受限制的,随着app应用的使用会导致内存的占用率增大.当内存占用率达到一种程度时.系统会发出内存警告.这时我们须要把一些不用 ...
- MVC5中Model层开发数据注解 EF Code First Migrations数据库迁移 C# 常用对象的的修饰符 C# 静态构造函数 MSSQL2005数据库自动备份问题(到同一个局域网上的另一台电脑上) MVC 的HTTP请求
MVC5中Model层开发数据注解 ASP.NET MVC5中Model层开发,使用的数据注解有三个作用: 数据映射(把Model层的类用EntityFramework映射成对应的表) 数据验证( ...
- HDU 3039 Go Home
今天本来解决的很好,本来可以不聊那么结束,但是我想更完美一点,多聊几句,谁知道就聊了很长时间,很傻逼.耽误了时间! /***************************************** ...
- javascript return 跟 break区别
break是跳出当前循环,return是中止函数的执行
- 最长公共字序列.cpp
<span style="color:#993399;">/* By yuan 2014/6/21 At nwpu.xf 1041.最长公共子序列 时限:1000ms ...
- Thread Runnable 区别
[线程的并发与并行] 在单CPU系统中,系统调度在某一时刻只能让一个线程运行,虽然这种调试机制有多种形式(大多数是时间片轮巡为主),但无论如何,要通过不断切换需要运行的线程让其运行的方式就叫并发(co ...