#define CP_BUNDLED_SOURCE #ifndef CP_BUNDLE_HEADER_3840A09F237A779E #define CP_BUNDLE_HEADER_3840A09F237A779E #ifdef TEMPLATE #else #define TEMPLATE # pragma GCC optimize("O3") #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; using uint=unsigned; using ll=long long; using ull=unsigned long long; using ld=long double; using pii=pair; using pll=pair; using i128=__int128; using u128=unsigned __int128; templateusing vc=vector; templateusing vvc=vc>; templateusing vvvc=vvc>; templateusing smpq=priority_queue,greater>; templateusing bipq=priority_queue; #define rep(i,n) for(ll i=0;i<(ll)(n);i++) #define REP(i,j,n) for(ll i=(j);i<(ll)(n);i++) #define DREP(i,n,m) for(ll i=(n);i>=(m);i--) #define drep(i,n) for(ll i=((n)-1);i>=0;i--) #define rall(x) x.rbegin(),x.rend() #define mp(...) make_pair(__VA_ARGS__) #define pb push_back #define fi first #define se second #define is insert #define bg begin() #define ed end() #define all(x) x.begin(),x.end() void scan(int&a) { cin >> a; } void scan(ll&a) { cin >> a; } void scan(string&a) { cin >> a; } void scan(char&a) { cin >> a; } void scan(uint&a) { cin >> a; } void scan(ull&a) { cin >> a; } void scan(bool&a) { cin >> a; } void scan(ld&a){ cin>> a;} template void scan(vector&a) { for(auto&x:a) scan(x); } void read() {} template void read(Head&head, Tail&... tail) { scan(head); read(tail...); } #define INT(...) int __VA_ARGS__; read(__VA_ARGS__); #define LL(...) ll __VA_ARGS__; read(__VA_ARGS__); #define ULL(...) ull __VA_ARGS__; read(__VA_ARGS__); #define STR(...) string __VA_ARGS__; read(__VA_ARGS__); #define VC(type, name, ...) vector name(__VA_ARGS__); read(name); #define VVC(type, name, size, ...) vector> name(size, vector(__VA_ARGS__)); read(name); templatevoid print(T a) { cout << a; } template void print(vectora) { for(int i=0;i<(int)a.size();i++){if(i)cout<<" ";print(a[i]);}} void PRT() { cout < void PRT(T a) { print(a); cout < void PRT(Head head, Tail ... tail) { print(head); cout << " "; PRT(tail...); return; } template bool chmin(T &x, F y){ if(x>y){ x=y; return true; } return false; } template bool chmax(T &x, F y){ if(x T floor(T a,T b){ return a/b-(a%b&&((a<0)!=(b<0))); } template T ceil(T a,T b){ return a/b+(a%b&&((a<0)==(b<0))); } template T bmod(T x,T y){ return x-y*floor(x,y); } template pairdivmod(T x,T y){ T q=floor(x,y); return{q,x-q*y}; } void YesNo(bool b){ cout<<(b?"Yes":"No")<stovi(const string&s,const string&S){ vcv(s.size()); rep(i,s.size()){ auto t=S.find(s[i]); assert(t!=string::npos); v[i]=t; } return v; } template T isqrt(T x){ T F=sqrtl(x); while((F+1)*(F+1)<=x)F++; while(F*F>x)F--; return F; } template T tri(T x){return x*(x-1)/2;} //[l,r) templateT tri(T l,T r){return (r-l)*(l+r-1)/2;} //n を先頭に持ってくる template vcrot(vcv,int n){ rotate(v.begin(),v.begin()+n,v.end()); return v; } template vciota(int n){ vcv(n);rep(i,n)v[i]=i; return v; } template vcargsort(const vc&a){ auto idx=iota(a.size()); sort(all(idx),[&](int i,int j){ return (minfirst?make_pair(a[i],i)make_pair(a[j],j)); }); return idx; } template vvctrans(const vvc&a){ assert(a.size()&&a[0].size()); rep(i,a.size())assert(a[i].size()==a[0].size()); vvcb(a[0].size(),vc(a.size())); rep(i,a.size())rep(j,a[0].size())b[j][i]=a[i][j]; return b; } vctrans(const vc&a){ assert(a.size()&&a[0].size()); rep(i,a.size())assert(a[i].size()==a[0].size()); vcb(a[0].size(),string(a.size(),0)); rep(i,a.size())rep(j,a[0].size())b[j][i]=a[i][j]; return b; } template int popcount(T n){ return __builtin_popcountll(n); } template L sum(const vc&a){ return accumulate(all(a),L(0)); } template struct subset_view{ T s; struct iterator{ T s,x; bool done; T operator*()const{return x;} iterator&operator++(){ if(x==0)done=true; else x=(x-1)&s; return*this; } bool operator!=(const iterator&r)const{return done!=r.done;} }; iterator begin()const{return{s,s,false};} iterator end()const{return{s,0,true};} }; template subset_viewsubset(T s){ return{s}; } template T max(vc&a){ return *max_element(all(a)); } template T min(vc&a){ return *min_element(all(a)); } template vc presum(vc &a){ vc ret(a.size()+1); rep(i,a.size())ret[i+1]=ret[i]+a[i]; return ret; } template vc &operator+=(vc &a,F b){ for (auto&v:a)v += b; return a; } template vc &operator-=(vc&a,F b){ for (auto&v:a)v-=b; return a; } template vc &operator*=(vc&a,F b){ for (auto&v:a)v*=b; return a; } template constexpr T pow(T a,T b){ T res=1; while(b){ if(b&1)res*=a; a*=a; b/=2; } return res; } constexpr ll ten(ll a){ return pow(10,a); } templateconstexpr T inf=numeric_limits::max()/2-1; template int tbit(T x){ using U=make_unsigned_t; U y=(U)x; return y?(int)bit_width(y)-1:-1; } template int lbit(T x){ using U=make_unsigned_t; U y=(U)x; return y?(int)countr_zero(y):-1; } template int tbit(T x,int p){ using U=make_unsigned_t; constexpr int W=numeric_limits::digits; U y=(U)x; if(p<0)return -1; if(p>=W-1)return tbit(y); return tbit(y&((U(1)<<(p+1))-1)); } template int lbit(T x,int p){ using U=make_unsigned_t; constexpr int W=numeric_limits::digits; U y=(U)x; if(p<0)return lbit(y); if(p>=W)return -1; return lbit(y&(~U(0)<>(istream&is,i128&x){ string s;is>>s; x=0; int i=0,neg=0; if(s[0]=='-')neg=1,i=1; for(;i<(int)s.size();i++)x=x*10+s[i]-'0'; if(neg)x=-x; return is; } ostream& operator<<(ostream&os,i128 x){ if(x==0)return os<<0; if(x<0)os<<"-"; u128 y=x<0?-(u128)x:(u128)x; string s; while(y)s.pb('0'+y%10),y/=10; reverse(all(s)); return os<sync_with_stdio(0); #ifdef LOCAL cout< #endif #endif #endif #ifndef CP_BUNDLE_HEADER_8DD6832EF023BDC7 #define CP_BUNDLE_HEADER_8DD6832EF023BDC7 template struct static_modint{ static_assert(0=0); static_modint mi; mi.val=v; return mi; } static_modint &operator+=(const static_modint&m){ u32 x=val+m.val-mod; val=x+(mod&-(x>>31)); return *this; } static_modint &operator-=(const static_modint&m){ u32 x=val-m.val; val=x+(mod&-(x>>31)); return *this; } static_modint &operator*=(const static_modint&m){ val=u64(val)*m.val%mod; return *this; } static_modint &operator/=(const static_modint&m){ val=u64(val)*m.inv().val%mod; return *this; } static_modint operator-() const{ return static_modint(mod-val); } static_modint operator+() const { return *this; } friend static_modint operator+(static_modint lhs, const static_modint& rhs){ return lhs+=rhs; } friend static_modint operator-(static_modint lhs, const static_modint& rhs){ return lhs-=rhs; } friend static_modint operator*(static_modint lhs, const static_modint& rhs){ return lhs*=rhs; } friend static_modint operator/(static_modint lhs,const static_modint&rhs){ return lhs/=rhs; } bool operator==(const static_modint&p) const{ return p.val==val; } bool operator!=(const static_modint&p) const{ return p.val!=val; } static_modint pow(int64_t n) const{ static_modint res(1),mul(val); while(n){ if(n%2)res*=mul; mul*=mul; n/=2; } return res; } friend ostream&operator<<(ostream&os,const static_modint&p){ os<>(istream&is,static_modint&p){ int64_t x; is>>x; p=static_modint(x); return is; } static_modint inv()const{ int64_t a=val,b=mod,u=1,v=0,t; #ifdef LOCAL assert(gcd(a,b)==1); #endif while(b>0){ t=a/b; swap(a-=t*b,b); swap(u-=t*v,v); } return static_modint(u); } }; #endif #ifndef CP_BUNDLE_HEADER_6661CEF0E4F73CF3 #define CP_BUNDLE_HEADER_6661CEF0E4F73CF3 #include template struct set_treap{ struct Node{ Node*lc,*rc; T val; int pri; int size; Node*update(){ size=1; if(lc)size+=lc->size; if(rc)size+=rc->size; return this; } }; void build(vcv){ for(auto&x:v)assert(x>=0); sort(all(v)); v.erase(unique(all(v)),v.end()); int n=v.size(); if(n==0){ root=NULL; return; } vcpts(n); for(int i=0;ival=v[i]; pts[i]->pri=mt(); } vcst; for(int i=0;ipripri){ last=st.back(); st.pop_back(); } pts[i]->lc=last; if(!st.empty())st.back()->rc=pts[i]; st.push_back(pts[i]); } root=st[0]; auto dfs=[&](auto&self,Node*cur)->void{ if(!cur)return; self(self,cur->lc); self(self,cur->rc); cur->update(); }; dfs(dfs,root); } Node*new_node(){ Node*nn=new Node(); nn->pri=mt(); nn->lc=nn->rc=0; nn->size=1; return nn; } static mt19937 mt; Node*root; set_treap(){ mt.seed(random_device{}()); root=NULL; } Node*merge(Node*l,Node*r){ if(!l)return r; if(!r)return l; if(l->pri>r->pri){ l->rc=merge(l->rc,r); return l->update(); }else{ r->lc=merge(l,r->lc); return r->update(); } } pairsplit(Node*l,T k){ if(!l)return {NULL,NULL}; if(l->valrc,k); l->rc=res.first; return {l->update(),res.second}; }else{ auto res=split(l->lc,k); l->lc=res.second; return {res.first,l->update()}; } } Node*insert(Node*x,T val){ auto s1=split(x,val); auto s2=split(s1.second,val+1); if(s2.first==NULL){ s2.first=new_node(); s2.first->val=val; } return merge(s1.first,merge(s2.first,s2.second)); } void insert(T val){ assert(val>=0); root=insert(root,val); } Node*erase(Node*x,T val){ auto s1=split(x,val); auto s2=split(s1.second,val+1); return merge(s1.first,s2.second); } void erase(T val){ assert(val>=0); root=erase(root,val); } bool count(T val){ assert(val>=0); auto s1=split(root,val); auto s2=split(s1.second,val+1); auto res=s2.first!=NULL; root=merge(s1.first,merge(s2.first,s2.second)); return res; } //min in [val,♾️) T next(T val){ assert(val>=0); auto s1=split(root,val); auto now=s1.second; while(now){ if(now->lc==NULL)break; now=now->lc; } T ans=numeric_limits::max(); if(now)chmin(ans,now->val); root=merge(s1.first,s1.second); if(ans==numeric_limits::max())return -1; else return ans; } //max in (-♾️,val) T prev(T val){ assert(val>=0); auto s1=split(root,val); auto now=s1.first; while(now){ if(now->rc==NULL)break; now=now->rc; } T ans=-1; if(now)chmax(ans,now->val); root=merge(s1.first,s1.second); return ans; } //[val,♾️) int bigger(T val){ assert(val>=0); int ans=size(); auto s1=split(root,val); if(s1.first)ans-=s1.first->size; root=merge(s1.first,s1.second); return ans; } int size(){ if(root==NULL)return 0; return root->size; } //(-♾️,val) int smaller(T val){ assert(val>=0); if(root==NULL)return 0; return size()-bigger(val); } //[l,r) int range_count(T l,T r){ assert(0<=l&&l<=r); return -bigger(r)+bigger(l); } T kth(Node*x,int k){ assert(x); assert(0<=k&&ksize); if(x->lc){ if(x->lc->size>k){ return kth(x->lc,k); } k-=x->lc->size; } if(k==0)return x->val; --k; return kth(x->rc,k); } T kth(int k){ assert(k>=0); if(k>=size())return -1; return kth(root,k); } }; template mt19937 set_treap::mt(random_device{}()); #endif #ifndef CP_BUNDLE_HEADER_ECFFAD09CB9B85DC #define CP_BUNDLE_HEADER_ECFFAD09CB9B85DC namespace MATMAT{ template struct is_mint : std::false_type {}; template struct is_mint> : std::true_type {}; }; template struct fixed_matrix; template struct matrix{ int n,m; vvca; matrix()=default; matrix(vvcb):a(b),n(b.size()),m(0){ if(b.size())m=b[0].size(); for(auto&row:b)assert((int)row.size()==m); } matrix(int n,int m):n(n),m(m){ assert(n>=0&&m>=0); a.assign(n,vc(m)); } vc&operator[](int i){ assert(0<=i&&i&operator[](int i)const{ assert(0<=i&&i>res(n,vc(mt2.m)); auto Mt2=mt2.trans(); if constexpr(MATMAT::is_mint::value){ rep(i,n)rep(j,mt2.m){ __int128 tmp{}; rep(k,m){ tmp+=(ll)a[i][k].val*Mt2[j][k].val; } res[i][j]=tmp%T::get_mod(); } }else{ rep(i,n)rep(j,mt2.m)rep(k,m){ res[i][j]+=a[i][k]*Mt2[j][k]; } } a=move(res); n=a.size(); m=(n?a[0].size():mt2.m); return *this; } matrix trans()const{ matrix res(m,n); rep(i,n)rep(j,m)res[j][i]=a[i][j]; return res; } int size()const{ return n; } int size2()const{ return m; } matrix operator-() const{ vvcb=a; for(auto&x:b)for(auto&e:x)e=-e; return matrix(b); } matrix operator+() const { return *this; } friend matrix operator+(matrix lhs, const matrix& rhs){ return lhs+=rhs; } friend matrix operator-(matrix lhs, const matrix& rhs){ return lhs-=rhs; } friend matrix operator*(matrix lhs, const matrix& rhs){ return lhs*=rhs; } matrix&operator*=(const T&v){ for(auto&row:a)for(auto&e:row)e*=v; return *this; } friend matrix operator*(matrix lhs, const T&rhs){ return lhs*=rhs; } friend matrix operator*(const T&lhs, matrix rhs){ return rhs*=lhs; } template matrix&operator*=(const fixed_matrix&mt2); static matrix unit(int n){ assert(n>=0); matrix mt(n,n); rep(i,n)mt[i][i]=1; return mt; } matrix pow(ll n){ assert(this->n==this->m); assert(n>=0); matrix res=unit(this->n); matrix mul=a; while(n){ if(n%2)res*=mul; mul*=mul; n/=2; } return res; } T det()const{ assert(n==m); auto A=a; T res=1; rep(i,n){ if(A[i][i]==0){ REP(j,i+1,n){ if(A[j][i]!=0){ swap(A[i],A[j]); res=-res; break; } } } if(A[i][i]==0)return 0; res*=A[i][i]; T IN=1/A[i][i]; REP(j,i,n)A[i][j]*=IN; REP(j,i+1,n){ T coef=A[j][i]; REP(k,i,n){ A[j][k]-=A[i][k]*coef; } } } return res; } int rank()const{ matrix a; if(n>m)a=matrix(*this).trans(); else a=matrix(*this); int N=a.n,M=a.m; int hj=0; rep(i,N){ int HI{-1},HJ{-1}; REP(hj2,hj,M){ REP(hi,i,N){ if(a[hi][hj2]!=0){ HI=hi,HJ=hj2; break; } } if(HI!=-1)break; } if(HJ==-1){ return i; } if(i!=HI)swap(a[i],a[HI]); T IN=1/a[i][HJ]; REP(j,HJ,M)a[i][j]*=IN; REP(hi,i+1,N){ T coef=a[hi][HJ]; REP(hj2,HJ,M){ a[hi][hj2]-=a[i][hj2]*coef; } } hj=HJ+1; } return N; } optional inverse()const{ assert(n==m); auto A=a; auto res=unit(n); int hj=0; rep(i,n){ int HI{-1},HJ{-1}; REP(hj2,hj,n){ REP(hi,i,n){ if(A[hi][hj2]!=0){ HI=hi,HJ=hj2; break; } } if(HI!=-1)break; } if(HJ==-1){ return nullopt; } if(i!=HI)swap(A[i],A[HI]),swap(res[i],res[HI]); T IN=1/A[i][HJ]; REP(j,0,n)A[i][j]*=IN,res[i][j]*=IN; REP(hi,i+1,n){ T coef=A[hi][HJ]; rep(hj2,n){ A[hi][hj2]-=A[i][hj2]*coef; res[hi][hj2]-=res[i][hj2]*coef; } } hj=HJ+1; } drep(i,n){ DREP(j,i-1,0){ rep(k,n)res[j][k]-=res[i][k]*A[j][i]; } } return res; } }; #endif #ifndef CP_BUNDLE_HEADER_412FFE9058386D60 #define CP_BUNDLE_HEADER_412FFE9058386D60 template struct binom_has_get_mod:false_type{}; template struct binom_has_get_mod>:true_type{}; template struct binom{ private: static vector&fact_table(){static vectorv={1};return v;} static vector&invfact_table(){static vectorv={1};return v;} static vector&invs_table(){static vectorv={0};return v;} static int&built_mod(){static int mod=-1;return mod;} public: static void build(int n){ auto&_fact=fact_table(); auto&_invfact=invfact_table(); auto&_invs=invs_table(); if constexpr(binom_has_get_mod::value){ auto mod=mint::get_mod(); if(built_mod()!=mod){ _fact={1}; _invfact={1}; _invs={0}; built_mod()=mod; } } if(n<(int)_fact.size())return; int old=_fact.size(); _fact.resize(n+1); _invfact.resize(n+1); _invs.resize(n+1); if constexpr(binom_has_get_mod::value){ auto mod=mint::get_mod(); for(int i=old;i<=n;i++){ _fact[i]=_fact[i-1]*i; if(i==1)_invs[i]=1; else _invs[i]=-_invs[mod%i]*(mod/i); _invfact[i]=_invfact[i-1]*_invs[i]; } }else{ for(int i=old;i<=n;i++){ _fact[i]=_fact[i-1]*i; _invs[i]=mint(1)/i; _invfact[i]=_invfact[i-1]*_invs[i]; } } } static mint fact(int i){ assert(i>=0); build(i); return fact_table()[i]; } static mint invfact(int i){ assert(i>=0); build(i); return invfact_table()[i]; } static mint inv(int i){ assert(i>0); build(i); return invs_table()[i]; } static mint C(int a,int b){//aCb if(b==0)return 1; if(a<0||b<0||a-b<0)return mint(0); build(a); auto&_fact=fact_table(); auto&_invfact=invfact_table(); return _fact[a]*_invfact[b]*_invfact[a-b]; } static mint iC(int a,int b){//1/aCb if(b==0)return 1; if(a<0||b<0||a-b<0)return mint(0); build(a); auto&_fact=fact_table(); auto&_invfact=invfact_table(); return _fact[b]*_fact[a-b]*_invfact[a]; } static mint P(int a,int b){ if(a; using B=binom; void solve(){ LL(a,b,n); if(n==0)return PRT(2); if(n==1)return PRT(2*a); matrixmt(2,2); mt[0][0]=2*a; mt[0][1]=-a*a+b; mt[1][0]=1; mt=mt.pow(n-1); PRT(mt[0][0]*2*a+mt[0][1]*2); } signed main(){ int t=1; // cin >> t; while(t--)solve(); }