#pragma GCC optimize("O2") #include using namespace std; const int MOD=1000000007; typedef complex cd; const double PI=acos(-1.0); long long modpow(long long a,long long e){long long r=1;for(;e;e>>=1,a=a*a%MOD)if(e&1)r=r*a%MOD;return r;} long long modinv(long long a){return modpow(a,MOD-2);} void fft(vector&a,bool inv){ int n=a.size(); for(int i=1,j=0;i>1;for(;j&b;b>>=1)j^=b;j^=b; if(i pmul(const vector&A,const vector&B){ if(A.empty()||B.empty())return{}; int sa=A.size(),sb=B.size(); if((long long)sa*sb<=400){ vectorr(sa+sb-1); for(int i=0;ifa(n),fb(n); for(int i=0;i>15); for(int i=0;i>15); fft(fa,false);fft(fb,false); vectorc0(n),c1(n),c2(n); for(int i=0;ir(sa+sb-1); for(int i=0;i<(int)r.size();i++){ long long v0=(long long)llround(c0[i].real()); long long v1=(long long)llround(c2[i].real()); long long v2=(long long)llround(c1[i].real()); long long v=((v0%MOD)+MOD)%MOD; v=(v+v1%MOD*B_)%MOD; v=(v+v2%MOD*((B_*B_)%MOD))%MOD; r[i]=(v+MOD)%MOD; } return r; } void trim(vector&a){while(a.size()>1&&a.back()==0)a.pop_back();} vector pinv(const vector&a,int n){ vectorr(1,modinv(a[0]));int cur=1; while(curt(a.begin(),a.begin()+min((int)a.size(),cur));t.resize(cur); auto rr=pmul(r,r);rr.resize(cur); rr=pmul(rr,t);rr.resize(cur); r.resize(cur); for(int i=0;i prem(vectora,const vector&b){ trim(a);int n=(int)a.size()-1,m=(int)b.size()-1; if(nar(a.rbegin(),a.rend());ar.resize(k); vectorbr(b.rbegin(),b.rend());br.resize(k); auto bi=pinv(br,k); auto qr=pmul(ar,bi);qr.resize(k); reverse(qr.begin(),qr.end()); auto qb=pmul(qr,b); vectorr=a; if((int)r.size()<(int)qb.size())r.resize(qb.size()); for(int i=0;i<(int)qb.size();i++){r[i]-=qb[i];if(r[i]<0)r[i]+=MOD;} if((int)r.size()>m)r.resize(m); trim(r);return r; } vector mpe(const vector&F,const vector&pt){ int n=pt.size();if(!n)return{}; int sz=1;while(sz>tr(2*sz); for(int i=0;i=1;i--){tr[i]=pmul(tr[i<<1],tr[i<<1|1]);trim(tr[i]);} vector>res(2*sz); res[1]=prem(F,tr[1]); for(int i=1;ians(n); for(int i=0;i>tr(2*sz); for(int i=0;i<(int)q;i++){long long v=(n-i*m)%MOD;if(v<0)v+=MOD;tr[sz+i]={v,1};} for(int i=sz-1;i>=1;i--){tr[i]=pmul(tr[i<<1],tr[i<<1|1]);trim(tr[i]);} vectorG=tr[1]; vectorpts(q);for(long long i=0;ib)return 1;return 0; } string sadd(string a,long long v){ int i=(int)a.size()-1; while(v&&i>=0){int d=a[i]-'0'+(v%10);v/=10;a[i]='0'+(d%10);if(d>=10)v++;i--;} while(v){a.insert(a.begin(),'0'+(char)(v%10));v/=10;} return strip0(a); } string ssub(string a,long long v){ int i=(int)a.size()-1; while(v&&i>=0){int d=a[i]-'0'-(v%10);v/=10;if(d<0){d+=10;v++;}a[i]='0'+d;i--;} return strip0(a); } pair sdivmod(string s,long long m){ long long r=0;string q; for(char c:s){r=r*10+(c-'0');q.push_back((char)('0'+r/m));r%=m;} return {strip0(q),r}; } long long stoll_mod(string s,bool&big){ s=strip0(s);long long v=0;big=false; for(char c:s){v=v*10+(c-'0');if(v>=MOD){big=true;break;}} return v; } int main(){ ios::sync_with_stdio(false);cin.tie(nullptr); int T;cin>>T; while(T--){ string Cs,Ps;cin>>Cs>>Ps; Cs=strip0(Cs);Ps=strip0(Ps); if(Ps=="0"){cout<<1<<"\n";continue;} bool big;long long P=stoll_mod(Ps,big); if(big){cout<<0<<"\n";continue;} if(P==0){cout<<1<<"\n";continue;} if(scmp(Cs,ssub(sadd(Ps,P),1))<0){cout<<0<<"\n";continue;} string ns=ssub(sadd(Cs,1),P); string nps=ssub(ns,P); auto[q1,r1]=sdivmod(ns,MOD); auto[q2,r2]=sdivmod(nps,MOD); if(strip0(q1)!=strip0(q2)){cout<<0<<"\n";continue;} long long n=((r1%MOD)+MOD)%MOD; if(n