传送门

题意

利用给出的式子求\(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(推公式+矩阵快速幂)的更多相关文章

  1. CCF 201312-4 有趣的数 (数位DP, 状压DP, 组合数学+暴力枚举, 推公式, 矩阵快速幂)

    问题描述 我们把一个数称为有趣的,当且仅当: 1. 它的数字只包含0, 1, 2, 3,且这四个数字都出现过至少一次. 2. 所有的0都出现在所有的1之前,而所有的2都出现在所有的3之前. 3. 最高 ...

  2. hihoCoder 1143 : 骨牌覆盖问题·一(递推,矩阵快速幂)

    [题目链接]:click here~~ 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 骨牌,一种古老的玩具.今天我们要研究的是骨牌的覆盖问题: 我们有一个2xN的长条形 ...

  3. [HDOJ2604]Queuing(递推,矩阵快速幂)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2604 递推式是百度的,主要是练习一下如何使用矩阵快速幂优化. 递推式:f(n)=f(n-1)+f(n- ...

  4. hdu 6185 递推+【矩阵快速幂】

    <题目链接> <转载于 >>> > 题目大意: 让你用1*2规格的地毯去铺4*n规格的地面,告诉你n,问有多少种不同的方案使得地面恰好被铺满且地毯不重叠.答案 ...

  5. HDU - 2604 Queuing(递推式+矩阵快速幂)

    Queuing Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  6. HDU5950 Recursive sequence 非线性递推式 矩阵快速幂

    题目传送门 题目描述:给出一个数列的第一项和第二项,计算第n项. 递推式是 f(n)=f(n-1)+2*f(n-2)+n^4. 由于n很大,所以肯定是矩阵快速幂的题目,但是矩阵快速幂只能解决线性的问题 ...

  7. 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 ...

  8. [题解][SHOI2013]超级跳马 动态规划/递推式/矩阵快速幂优化

    这道题... 让我见识了纪中的强大 这道题是来纪中第二天(7.2)做的,这么晚写题解是因为 我去学矩阵乘法啦啦啦啦啦对矩阵乘法一窍不通的童鞋戳链接啦 层层递推会TLE,正解矩阵快速幂 首先题意就是给你 ...

  9. HDU-6185-Covering(推递推式+矩阵快速幂)

    Covering Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

随机推荐

  1. zabbix之Low-level discovery(自动发现)

    功能: 自动发现挂载点并自动监控 自动发现网卡并自动监控 创建自动发现挂载点并监控 功能 假如要在monitor_linux模板中创建自动发现挂载点的功能 配置-->模板-->选择模板-- ...

  2. ubuntu 添加和删除用户

    Without a home directory sudo useradd myuser With home directory sudo useradd -m myuser Then set the ...

  3. cocos2d-x wp8 中文显示问题

    cocos2d-x项目在wp8下中文显示不了.有两个原因: 1. 本身字符串的utf8编码, 有问题. 2. 显示中文所须要的字体,缺失. 要解决第二个问题非常easy,在fonts下加入一个中文字体 ...

  4. node 爬虫 --- 批量下载图片

    步骤一:创建项目 npm init 步骤二:安装 request,cheerio,async 三个模块 request 用于请求地址和快速下载图片流. https://github.com/reque ...

  5. Intel的东进与ARM的西征(5)--智慧的大窗口,我们都在画里面

    http://www.36kr.com/p/200168.html 繁华又算得了什么,不过是星尘的崩碎,那一抹青青的灰.公元 79 年,意大利维苏威火山喷发,已然兴盛了 600 年的庞贝古城被完全湮没 ...

  6. Metasploit学习笔记之——情报搜集

    1.情报搜集 1.1外围信息搜索 1.1.1通过DNS和IP地址挖掘目标网络信息 (1)whois域名注冊信息查询(BT5.kali专有):root@kali:~# whois testfire.ne ...

  7. Android开发之中的一个个简单的通讯录实现(源代码)

    通讯录就是一个ListView.我们须要通过数据库和ContentProvider来活动通讯录的数据.当然,我们应该提供选中后编辑的功能. 非常easy的一个通讯略Demo,所以.直接上代码,须要的看 ...

  8. MapReduce算法形式二:去重(shuffle)

    案例二:去重(shuffle/HashSet等方法)shuffle主要针对的是key去重HashSet主要针对values去重

  9. XMU C语言程序设计实践(5)

    •       使用动态链表完成一个简单的商品库存信息管理系统. •       商品信息包括如下字段:商品号.商品名称.商品库存 •       函数 create:接收用户输入的商品号和商品名称的 ...

  10. safi 中placeholder不垂直居中

    用css hack将line-height 设置为1 例子: input{height: 32px; line-height: 32px; [;line-height: 1px;]};