#include "bits/stdc++.h" using namespace std; #define FOR(i,j,k) for(int (i)=(j);(i)<(int)(k);++(i)) #define rep(i,j) FOR(i,0,j) #define each(x,y) for(auto &(x):(y)) #define mp make_pair #define mt make_tuple #define all(x) (x).begin(),(x).end() #define debug(x) cout<<#x<<": "<<(x)< pii; typedef vector vi; typedef vector vll; const int MOD = (int)1e9 + 7; int add(int a, int b){ int c = a + b; if(c >= MOD)c -= MOD; else if(c < 0)c += MOD; return c; } void sadd(int &a, int b){ a += b; if(a >= MOD)a -= MOD; else if(a < 0)a += MOD; } int mul(int a, int b){ return (int)((long long)a*b%MOD); } void smul(int &a, int b){ a = (int)((long long)a*b % MOD); } int powm(int a, long long k){ long long res=1, b = a; while(k){ if(k&1)res=res*b%MOD; b=b*b%MOD; k >>= 1; } return (int)res; } int inverse(int x){ long long a = x, b = MOD, u = 1, v = 0; while(b) { long long t = a / b; a -= t * b; swap(a, b); u -= t * v; swap(u, v); } if(u < 0)u += MOD; return (int)u; } ll K, L, R; ll cnt[61][10]; ll len[61]; pair f(ll r) { pair res(0, 1); if(r == 0) res; int k = -1; while(len[k+1] <= r) { k++; } r -= len[k]; if(k + (r>0?1:0) > K) { cout << -1 << endl; exit(0); } rep(i, 10) { int x = i == 0 ? 10 : i; res.first += cnt[k][i] * x; smul(res.second, powm(x, cnt[k][i])); } if(r > 0) { int val = (k + 1)*(k + 1); string s = to_string(val); for(int i = 0; i < sz(s) && r>0; i++) { r--; int x = s[i] == '0' ? 10 : s[i] - '0'; res.first += x; smul(res.second, x); } } if(r > 0) { auto sub = f(r); res.first += sub.first; smul(res.second, sub.second); } return res; } int main(){ ios::sync_with_stdio(false); cin.tie(0); cin >> K >> L >> R; len[1] = 1; cnt[1][1] = 1; for(int i = 2; i <= 60; ++i) { int val = i*i; len[i] = len[i - 1] * 2 + sz(to_string(i*i)); rep(j, 10) { cnt[i][j] = cnt[i - 1][j] * 2; } while(val > 0) { cnt[i][val % 10]++; val /= 10; } } auto res_r = f(R), res_l = f(L - 1); ll sum = res_r.first - res_l.first; int mulmul = mul(res_r.second, inverse(res_l.second)); cout << sum << ' ' << mulmul << endl; }