#pragma once
#include<utility>usingnamespacestd;structBarrett{usingu32=unsignedint;usingi64=longlong;usingu64=unsignedlonglong;u32m;u64im;Barrett():m(),im(){}Barrett(intn):m(n),im(u64(-1)/m+1){}constexprinlinei64quo(u64n){u64x=u64((__uint128_t(n)*im)>>64);u32r=n-x*m;returnm<=r?x-1:x;}constexprinlinei64rem(u64n){u64x=u64((__uint128_t(n)*im)>>64);u32r=n-x*m;returnm<=r?r+m:r;}constexprinlinepair<i64,int>quorem(u64n){u64x=u64((__uint128_t(n)*im)>>64);u32r=n-x*m;if(m<=r)return{x-1,r+m};return{x,r};}constexprinlinei64pow(u64n,i64p){u32a=rem(n),r=m==1?0:1;while(p){if(p&1)r=rem(u64(r)*a);a=rem(u64(a)*a);p>>=1;}returnr;}};