Description
有两个序列A和B,其中:
A[i]=A[i-1]*a+b
B[i]=2*B[i/2]+1(i为偶数)
B[i]=2*B[(i-1)/2]+(i+1)/2(i为奇数)
给出A[0],a,b,n,问B[a[n]]和B[a[n]+1]之间的大小关系。
A[0],a,b,n<=10^15
Solution
首先把B序列算出来。
发现除了B[0]=B[1]以外,B[i]与B[i+1]之间的关系成=<><循环。
那么我们就可以用矩阵乘法算出A[n]%4的值。
注意A[n]=0的情况。
Code
#include<cstdio>
#include<cstring>
#include<algorithm>
#define fo(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
typedef long long ll;
struct Matrix{
int a[2][2];
friend Matrix operator*(Matrix y,Matrix z) {
Matrix x;memset(x.a,0,sizeof(x.a));
fo(i,0,1) fo(j,0,1) {
fo(k,0,1) x.a[i][j]+=y.a[i][k]*z.a[k][j];
x.a[i][j]%=4;
}
return x;
}
}tmp;
Matrix mi(Matrix x,ll y) {
Matrix z;memcpy(z.a,x.a,sizeof(x.a));
for(y--;y;y/=2,x=x*x) if (y&1) z=z*x;
return z;
}
ll a_0,a,b,n;
int ty;
char s[4]={'<','=','<','>'};
int main() {
for(scanf("%d",&ty);ty;ty--) {
scanf("%lld%lld%lld%lld",&a_0,&a,&b,&n);
if (!a_0&&!n) {printf("=\n");continue;}
if (!a_0&&!b) {printf("=\n");continue;}
a_0%=4;a%=4;b%=4;memset(tmp.a,0,sizeof(tmp.a));
tmp.a[0][0]=a;tmp.a[1][0]=tmp.a[1][1]=1;
tmp=mi(tmp,n);a_0=(a_0*tmp.a[0][0]+b*tmp.a[1][0])%4;
putchar(s[a_0]);printf("\n");
}
}