#include #include #include using namespace atcoder; using mint = modint1000000007; using namespace std; using ll = long long; using P = pair; ll exgcd(ll a,ll b,ll &x,ll &y){ x=0, y=1; ll u=1, v=0; while(a){ ll t{b/a}; swap(b-=t*a, a); swap(x-=t*u, u); swap(y-=t*v, v); } if(b<0) b*=-1, x*=-1, y*=-1; return b; } ll inv(ll a, ll MOD){ ll x{0},y{1}; exgcd(a,MOD,x,y); return (x%MOD+MOD)%MOD; } ll garner(vector&b,vector&m){ int sz = m.size(); vector coef(sz,1), cons(sz,0); for(int k=0; k<(int)b.size(); k++){ ll t = (b[k]-cons[k]); t *= inv(coef[k],m[k]); t = ( (t%m[k]) + m[k] ) % m[k]; for(int i=k+1; i mod_conv(vectora,vectorb){ int MOD = mint::mod(); const int nhg2 = 167772161; const int nhg3 = 469762049; const int nhg4 = 1224736769; vectorc(a.size()),d(b.size()); for(int i=0; i<(int)a.size(); i++){ c[i] = a[i].val(); } for(int i=0; i<(int)b.size(); i++){ d[i] = b[i].val(); } auto x = convolution(c,d); auto y = convolution(c,d); auto z = convolution(c,d); int n = x.size(); vector ret(n); vector f {nhg2,nhg3,nhg4,MOD}; for(int i=0; i e {x[i],y[i],z[i]}; ret[i] = garner(e,f); } return ret; } int main(){ int n; cin>>n; vectora(n+1),b(n+1); for(int i=0; i<=n; i++){ int t; cin>>t; a[i] = t; } for(int i=0; i<=n; i++){ int t; cin>>t; b[i] = t; } auto c = mod_conv(a,b); mint ans{}; for(int i=0; i<=n; i++){ ans += c[i]; } cout<