Funny Function————(hdu6050)矩阵快速幂
来源:互联网 发布:网速监控软件 编辑:程序博客网 时间:2024/06/09 20:39
题目:点击打开链接
这道题可以利用矩阵快速幂做 但是有些大神硬推公式就推出来了,佩服佩服利用第一行F(1,k)推导可以发现当j为奇数(F(i,1)+F(i,2)+……+F(i,j))=F(i,j+1)-F(i,2)+F(i,1);当j为偶数的时候(F(i,1)+F(i,2)+……+F(i,j))=F(i,j+1)-F(i,1);当n为偶数的时候我们进行(两行为一个矩阵运算){F(i,1)}={F(i-1,n+1)-F(i-1,1)}={F(i-1,n+1)}-{F(i-1,1)}F(i,2) F(i-1,n+2)-F(i-1,2) F(i-1,n+2) - F(i-1,2){F(i-1,n+1)}={0 1}{F(i-1,n)} = {0 1}^n{F(i-1,1)}F(i-1,n+2) 2 1 F(i-1,n+1 2 1 F(i-1,2){F(i,1)}=[{0 1}^n-{1 0}]{F(i-1,1)}F(i,2) 2 1 0 1 F(i-1,2){F(i,1)}=[{0 1}^n-{1 0}]^(m-1){F(1,1)}
F(i,2) 2 1 0 1 F(1,2)同理n为奇数的时候同理矩阵那个{F(i,1)}=[{0 1}^n-{-1 1}]^(m-1){F(1,1)}
F(i,2) 2 1 2 0 F(1,2)
然后直接快速幂#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
struct matrix
{
ll f[2][2];
};
matrix mul(matrix a,matrix b)
{
matrix ans;
memset(ans.f,0,sizeof(ans.f));
for(int i=0; i<2; i++)
{
for(int j=0; j<2; j++)
{
for(int k=0; k<2; k++)
{
ans.f[i][j]=(ans.f[i][j]+a.f[i][k]*b.f[k][j]%mod)%mod;
}
}
}
return ans;
}
matrix pow(matrix a, ll p)
{
matrix res;
memset(res.f,0,sizeof(res.f));
for(int i=0; i<2; i++)
res.f[i][i]=1;
while(p)
{
//cout<<"___"<<endl;
if(p&1)
res=mul(res,a);
p>>=1;
a=mul(a,a);
}
return res;
}
int main()
{
int T;
scanf("%d",&T);
ll n,m;
while(T--)
{
scanf("%lld%lld",&n,&m);
//cout<<n<<" "<<m<<endl;
if(n%2==1)
{
matrix a;
a.f[0][0]=0;
a.f[0][1]=1;
a.f[1][0]=2;
a.f[1][1]=1;
a=pow(a,n);
a.f[0][0]+=1;
a.f[0][1]-=1;
a.f[1][0]-=2;
a=pow(a,m-1);
printf("%lld\n",(a.f[0][0]+a.f[0][1])%mod);
}
else
{
matrix a;
a.f[0][0]=0;
a.f[0][1]=1;
a.f[1][0]=2;
a.f[1][1]=1;
a=pow(a,n);
a.f[0][0]-=1;
a.f[1][1]-=1;
a=pow(a,m-1);
printf("%lld\n",(a.f[0][0]+a.f[0][1])%mod);
}
}
return 0;
}
阅读全文
0 0
- Funny Function————(hdu6050)矩阵快速幂
- HDU6050 Funny Function[矩阵快速幂]
- hdu6050 Funny Function【打表+找规律+矩阵快速幂】
- 2017多校训练第二场 hdu6050 Funny Function(数学+快速幂+逆元)
- HDU6050(矩阵快速幂)
- HDU6050-Funny Function
- HDU6050-Funny Function
- 2017杭电多校联赛第二场-Funny Function (hdu6050)快速幂解数学方程
- hdu 6050 Funny Function (矩阵快速幂)
- HDU 6050 Funny Function 矩阵快速幂
- hdu 6050Funny Function矩阵快速幂
- Hdu6050 Funny Function(2017多校第2场)
- hdu6050 推公式矩阵快速幂
- (矩阵快速幂, 数学公式推导)HDU 6050 Funny Function
- HDU 6050 Funny Function(矩阵快速幂或公式)
- HDU 6050 Funny Function(快速幂)
- HDU 6050 Funny Function(构造矩阵+推公式)——2017 Multi-University Training Contest
- 2017多校训练Contest2: 1006 Funny Function hdu6050
- 数据结构 -- 队列 & 循环队列 -- 数组实现
- Java 封装,继承,多态!三者的关系!
- css学习笔记(二)
- AngularJS Phonecat(步骤0-步骤5)
- a标签突出显示盒子非js效果
- Funny Function————(hdu6050)矩阵快速幂
- nltk入门函数解释(concordance,similar,common_contexts)
- android 沉沁式简单实现
- angular中ng-repeat及track by
- 剑指Offer——调整数组顺序使奇数位于偶数前面
- MOOC清华《程序设计基础》第7章:统计活跃用户数
- 异常机制
- AngularJS Phonecat (步骤6-步骤7)
- A