#include #include using namespace atcoder; using mint = modint998244353; using namespace std; template using vec = vector; using ll = long long; using vi = vec; using vs = vec; using si = set; using sll = set; using vc = vec; using vvi = vec; using vll = vec; using vvll = vec; using pii = pair; using pll = pair; using mii = map; using mll = map; using msi = map; using vpii = vec; using vpll = vec; using spii = set; using spll = set; #define rep(i,j,n) for(ll i=j;i=j; i--) #define rp(i,n) rep(i,0,n) #define rrp(i,n) rrep(i,0,n) #define all(v) v.begin(), v.end() #define pb push_back #define ins insert #define yes cout<<"Yes"< void in(T&... X) { (cin >> ... >> X); } template void ain(vec& Y) { rp(K, Y.size()) cin >> Y[K]; } template void ain(set& Y, auto n) { rp(i, n) { T YY; cin >> YY; Y.insert(YY); } } template void ain(multiset& Y, auto n) { rp(i, n) { T YY; cin >> YY; Y.insert(YY); } } template void bin(vec>& Z) { rp(L, Z.size()) ain(Z[L]); } ll mod0 = 998244353, lmax = 9e18, inf = 2e9; double pi = 3.141592653589793238462643; template void aout(T& a) { for (auto I : a) cout << I << " "; cout << endl; } template void aout(queue a) { while (!a.empty()) { cout << a.front(); a.pop(); } } template void aout(stack a) { while (!a.empty()) { cout << a.top(); a.pop(); } } #define bout(a) {for(auto J:a) aout(J);cout< bool chmin(T& M1, T M2) { if (M1 > M2) { M1 = M2; return 1; } else return 0; } template bool chmax(T& M1, T M2) { if (M1 < M2) { M1 = M2; return 1; } else return 0; } template auto vmax(T& a) { return *max_element(all(a)); } template auto vmin(T& a) { return *min_element(all(a)); } template auto lwa(vector& a, T b) {//aでbより小さい最大の値のイテレータ auto i = lwb(all(a), b); if (i == a.begin()) return a.end(); else i--; return i; } template auto lwa(set& a, T b) {//aでbより小さい最大の値のイテレータ auto i = a.lwb(b); if (i == a.begin()) return a.end(); else i--; return i; } template auto lwa(multiset& a, T b) {//aでbより小さい最大の値のイテレータ auto i = a.lwb(b); if (i == a.begin()) return a.end(); else i--; return i; } template auto lwc(vector& a, T b) {//aでb以下の最大の値のイテレータ auto i = lwb(all(a), b); if (i != a.end() && *i == b) return i; if (i == a.begin()) return a.end(); else i--; return i; } template auto lwc(set& a, T b) {//aでb以下の最大の値のイテレータ auto i = a.lwb(b); if (i != a.end() && *i == b) return i; if (i == a.begin()) return a.end(); else i--; return i; } template auto lwc(multiset& a, T b) {//aでb以下の最大の値のイテレータ auto i = a.lwb(b); if (i != a.end() && *i == b) return i; if (i == a.begin()) return a.end(); else i--; return i; } template vec rsw(vec& a) {//累積和 vec b = a; rep(i, 1, b.size()) b[i] += b[i - 1]; return b; } bool kai(string S) {//回文か判定 bool ans = 1; rp(i, S.size()) if (S[i] != S[S.size() - 1 - i]) ans = 0; return ans; } sll yk(ll n) {//約数全列挙O(sqrt(N)),set sll yaku; for (ll i = 1; i * i <= n; i++) if (n % i == 0) { yaku.insert(i); yaku.insert(n / i); } return yaku; } vi ssa(int n) {//n:必要な素数の最大値 素数全列挙 vector prime; vectorlpf(n + 1, 0); rep(i, 2, n + 1) { if (lpf[i] == 0) { lpf[i] = i; prime.push_back(i); } for (int k : prime) { if (k * i > n || k > lpf[i]) break;//k最小素因数よりk<=i lpf[k * i] = k;//kを最小素因数に持つ数k*iを拾う } } return prime; } vector sib(ll x) {//素因数分解 if (x == 1) return vector(1, { 1,1 }); vector ans; for (ll i = 2; i * i <= x; i++) {//rootx回iを回しxで割る ll kaisu = 0; while (x % i == 0) { x /= i; kaisu++; } if (kaisu > 0) ans.pb({ i,kaisu }); } if (x != 1) ans.pb({ x,1 }); return ans; } template vec zat(vec a) {//座標圧縮 auto b = a; sort(all(b)); b.erase(unique(all(b)), b.end()); vec c(a.size()); rp(i, a.size()) { c[i] = lwb(all(b), a[i]) - b.begin(); } return c; } //segtreeeee //Range min query int op(int a, int b) { return min(a, b); } int e() { return (int)(1e9); } ll cc(ll a, ll b) { return (a * a + b * b) * (a + b); } //cout<> a >> b >> c >> d; cout << a * c - b * d << " " << a * d + b * c; }