結果
問題 | No.493 とても長い数列と文字列(Long Long Sequence and a String) |
ユーザー |
|
提出日時 | 2017-03-10 23:46:04 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 3 ms / 800 ms |
コード長 | 2,871 bytes |
コンパイル時間 | 1,049 ms |
コンパイル使用メモリ | 82,164 KB |
実行使用メモリ | 6,948 KB |
最終ジャッジ日時 | 2024-06-24 09:04:02 |
合計ジャッジ時間 | 3,420 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 115 |
ソースコード
#include <iostream>#include <cstdio>#include <algorithm>#include <functional>#include <string>#include <vector>#include <set>#include <map>using namespace std;const int mod = 1e9 + 7;struct modint {int n;modint(int n = 0) : n(n) {}};int modpow(int a, long long b) {int ret = 1;while (b > 0) {if (b & 1) {ret = 1LL * ret * a % mod;}a = 1LL * a * a % mod;b >>= 1;}return ret;}modint operator+(modint a, modint b) { return modint((a.n += b.n) >= mod ? a.n - mod : a.n); }modint operator-(modint a, modint b) { return modint((a.n -= b.n) < 0 ? a.n + mod : a.n); }modint operator*(modint a, modint b) { return modint(1LL * a.n * b.n % mod); }modint operator/(modint a, modint b) { return modint(1LL * a.n * modpow(b.n, mod - 2) % mod); }modint &operator+=(modint &a, modint b) { return a = a + b; }modint &operator-=(modint &a, modint b) { return a = a - b; }modint &operator*=(modint &a, modint b) { return a = a * b; }int intlen(int n) {int ret = 0;while (n > 0) {ret++;n /= 10;}return ret;}int digitsum(int n) {int ret = 0;while (n > 0) {if (n % 10 == 0) {ret += 10;} else {ret += n % 10;}n /= 10;}return ret;}modint digitprod(int n) {modint ret = 1;while (n > 0) {if (n % 10 == 0) {ret *= 10;} else {ret *= n % 10;}n /= 10;}return ret;}long long len(long long k) {if (k == 1) {return 1;}return intlen(k * k) + len(k - 1) * 2;}long long ff(int d) {if (d == 1) {return 1;}return ff(d - 1) * 2 + digitsum(d * d);}long long f(int d, long long k) {if (k == 0) {return 0;}if (d == 1) {return 1;}if (k <= len(d - 1)) {return f(d - 1, k);} else if (k <= len(d - 1) + intlen(d * d)) {k -= len(d - 1);string s = to_string(d * d);long long ret = ff(d - 1);for (int i = 0; i < k; i++) {if (s[i] == '0') {ret += 10;} else {ret += s[i] - '0';}}return ret;} else {return ff(d - 1) + digitsum(d * d) + f(d - 1, k - len(d - 1) - intlen(d * d));}}modint gg(int d) {if (d == 1) {return 1;}modint ret = gg(d - 1);return ret * ret * digitprod(d * d);}modint g(int d, long long k) {if (k == 0) {return 1;}if (d == 1) {return 1;}if (k <= len(d - 1)) {return g(d - 1, k);} else if (k <= len(d - 1) + intlen(d * d)) {k -= len(d - 1);string s = to_string(d * d);modint ret = gg(d - 1);for (int i = 0; i < k; i++) {if (s[i] == '0') {ret *= 10;} else {ret *= s[i] - '0';}}return ret;} else {return gg(d - 1) * digitprod(d * d) * g(d - 1, k - len(d - 1) - intlen(d * d));}}int main() {long long K, L, R;cin >> K >> L >> R;K = min(60LL, K);if (R > len(K)) {cout << -1 << endl;return 0;}cout << f(K, R) - f(K, L - 1) << " ";cout << (g(K, R) / g(K, L - 1)).n << endl;}