Description
有两个数列A和B
已知A0,a,b,N
An=A(n−1)∗a+b(n>=1)
B数列满足
Bn=2∗B(n/2)+1(n为偶数)
Bn=2∗B((n−1)/2)+(n+1)/2(n为奇数)
现在问B数列的第AN项和第(AN)+1项的关系
T组数据
A0,a,b,N<=1e15
T<=100
Solution
一看到这种题就拿出草稿纸暴搜b的值
然后,发现题目只用输出大小关系,那么我们可以找一找大小的规律,因为这种题直接算肯定是不行的。
然后我们发现从1开始b[i]与b[i+1]的大小关系是=<><一直循环。
矩阵乘法
用矩阵求出a的值,不断地mod 4,就好了。
然后直接输出。
注意
要特判a[n]=0的情况,这种情况输出=。
要用快速乘
否则会爆!
Code
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define fo(i,a,b) for(i=a;i<=b;i++)
using namespace std;
const int mo=4;
typedef long long ll;
ll i,j,k,l,t,n,m,ans,q;
ll qsc(ll x,ll y){
ll a1=x/1000000,a2=x%1000000,b1=y/1000000,b2=y%1000000,z=0;
z=(a1*b1%mo*1000000%mo*1000000%mo);
z=(z+a1*b2%mo*1000000%mo);
z=(z+a2*b2%mo);
z=(z+a2*b1%mo*1000000%mo);
return z%mo;
}
struct node{
ll ju[2][2];
node friend operator *(node x,node y){
node z;int i,j,k;memset(z.ju,0,sizeof(z.ju));
fo(i,0,1){
fo(j,0,1){
fo(k,0,1)(z.ju[i][j]+=qsc(x.ju[i][k],y.ju[k][j]))%=4;
}
}
return z;
}
}a,b;
node qsm(node x,ll y){
node z;memset(z.ju,0,sizeof(z.ju));
fo(i,0,1)z.ju[i][i]=1;
while(y){
if(y&1)z=z*x;
y/=2;
x=x*x;
}
return z;
}
int main(){
for(scanf("%lld",&q);q;q--){
memset(a.ju,0,sizeof(a.ju));memset(b.ju,0,sizeof(b.ju));
scanf("%lld%lld%lld%lld",&a.ju[0][0],&b.ju[0][0],&a.ju[0][1],&n);
if(a.ju[0][0]==0&&a.ju[0][1]==0){
printf("=\n");
continue;
}
b.ju[1][0]=1,b.ju[1][1]=1;
a=a*qsm(b,n);
if(n==0){
printf("=\n");
continue;
}
if(a.ju[0][0]==0)printf("<\n");
else if(a.ju[0][0]==1)printf("=\n");
else if(a.ju[0][0]==2)printf("<\n");
else printf(">\n");
}
}