Funny Function
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1057 Accepted Submission(s): 505
Problem Description
Function
F
x,y
satisfies:
For given integers N and M,calculate
F
m,1
modulo 1e9+7.
Input
There is one integer T in the first line.
The next T lines,each line includes two integers N and M .
1<=T<=10000,1<=N,M<2^63.
Output
For each given N and M,print the answer in a single line.
Sample Input
2
2 2
3 3
Sample Output
2
33
Source
2017 Multi-University Training Contest - Team 2
#include<cstdio>
#include<cstring>
#define MOD 1000000007
using namespace std;
typedef long long int ll;
typedef struct matrix
{
ll elem[2][2];
}matrix;
ll n,m;
matrix A={0,2,1,1};
matrix B0={1,0,0,1},B1={-1,2,1,0};
matrix multi1(matrix p,matrix q)
{
matrix c;
memset(c.elem,0,sizeof(c.elem));
for(int i=0;i<2;i++) //p的第i行
{
for(int j=0;j<2;j++) //q的第j列
{
for(int k=0;k<2;k++)
{
c.elem[i][j]=(c.elem[i][j]+p.elem[i][k]*q.elem[k][j])%MOD;
}
}
}
return c;
}
matrix multi2(matrix p,matrix q)
{
matrix c;
memset(c.elem,0,sizeof(c.elem));
for(int i=0;i<1;i++) //p的第i行
{
for(int j=0;j<2;j++) //q的第j列
{
for(int k=0;k<2;k++)
{
c.elem[i][j]=(c.elem[i][j]+p.elem[i][k]*q.elem[k][j])%MOD;
}
}
}
return c;
}
matrix jian(matrix p,matrix q)
{
matrix c;
memset(c.elem,0,sizeof(c.elem));
for(int i=0;i<2;i++)
{
for(int j=0;j<2;j++)
{
c.elem[i][j]=(p.elem[i][j]-q.elem[i][j])%MOD;
}
}
return c;
}
matrix quickmulti(matrix p,ll k)
{
matrix ans={1,0,0,1};
while(k)
{
if(k&1)ans=multi1(p,ans);
p=multi1(p,p);
k>>=1;
}
return ans;
}
int main()
{
int t;
matrix s,p,ans;
scanf("%d",&t);
s.elem[0][0]=1;
s.elem[0][1]=1;
while(t--)
{
scanf("%lld%lld",&n,&m);
p=quickmulti(A,n);
if(n%2==0)
{
p=jian(p,B0);
}
else
{
p=jian(p,B1);
}
p=quickmulti(p,m-1);
ans=multi2(s,p);
printf("%lld\n",ans.elem[0][0]);
}
return 0;
}