Farmer John likes to play mathematics games with his N cows. Recently, they are attracted by recursive sequences. In each turn, the cows would stand in a line, while John writes two positive numbers a and b on a blackboard. And then, the cows would say their identity number one by one. The first cow says the first number a and the second says the second number b. After that, the i-th cow says the sum of twice the (i-2)-th number, the (i-1)-th number, and i4i4. Now, you need to write a program to calculate the number of the N-th cow in order to check if John’s cows can make it right.
Input
The first line of input contains an integer t, the number of test cases. t test cases follow.
Each case contains only one line with three numbers N, a and b where N,a,b < 231231 as described above.
Output
For each test case, output the number of the N-th cow. This number might be very large, so you need to output it modulo 2147493647.
Sample Input
2 3 1 2 4 1 10
Sample Output
85 369
Hint
In the first case, the third number is 85 = 2*1十2十3^4. In the second case, the third number is 93 = 2*1十1*10十3^4 and the fourth number is 369 = 2 * 10 十 93 十 4^4.
思路 很明显的矩阵快速幂 之前只知道思想 第一次敲 比较丑陋
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[7][7] = {
0,2,0,0,0,0,0,
1,1,0,0,0,0,0,
0,0,1,1,1,1,1,
0,0,0,1,2,3,4,
0,0,0,0,1,3,6,
0,0,0,0,0,1,4,
0,1,0,0,0,0,1
};
ll b[7][7] =
{
0,2,0,0,0,0,0,
1,1,0,0,0,0,0,
0,0,1,1,1,1,1,
0,0,0,1,2,3,4,
0,0,0,0,1,3,6,
0,0,0,0,0,1,4,
0,1,0,0,0,0,1
};
ll ans[7][7];
ll c[10][10];
void init()
{
for(int i = 0;i<7;i++)
{
for(int j = 0;j<7;j++)
{
a[i][j] = b[i][j];
if(i==j) ans[i][j] = 1;
else ans[i][j] = 0;
}
}
}
void ch()
{
ll x,i,j,k;
for(i=0;i<7;i++)
{
for(j=0;j<7;j++)
{
x = 0;
for(k=0;k<7;k++)
{
x += ans[i][k] * a[k][j];
x %= 2147493647;
}
x %= 2147493647;
c[i][j] = x;
}
}
for(i=0;i<7;i++)
{
for(j=0;j<7;j++)
{
ans[i][j] = c[i][j];
}
}
}
void ch1()
{
ll x,i,j,k;
for(i=0;i<7;i++)
{
for(j=0;j<7;j++)
{
x = 0;
for(k=0;k<7;k++)
{
x += a[i][k] * a[k][j];
x %= 2147493647;
}
x %= 2147493647;
c[i][j] = x;
}
}
for(i=0;i<7;i++)
{
for(j=0;j<7;j++)
{
a[i][j] = c[i][j];
}
}
}
void qpow(ll n)
{
ll i,j;
while(n)
{
if(n%2==1)
{
ch();
}
ch1();
n/=2;
}
}
int main()
{
ll n,m,x,y,t,i,j;
scanf("%lld",&t);
while(t--)
{
init();
scanf("%lld%lld%lld",&n,&x,&y);
if(n == 1)
{
printf("%lld\n",x);
continue;
}
if(n == 2)
{
printf("%lld\n",y);
continue;
}
qpow(n-2);
ll anss = (ans[0][1]*x+ ans[1][1] * y + 1*ans[2][1]+3*ans[3][1] + 9*ans[4][1] + 27*ans[5][1] + 81*ans[6][1])%2147493647;
printf("%lld\n",anss);
}
return 0;
}