結果

問題 No.493 とても長い数列と文字列(Long Long Sequence and a String)
ユーザー kimiyuki
提出日時 2017-03-11 17:06:38
言語 C++14
(gcc 13.3.0 + boost 1.87.0)
結果
WA  
実行時間 -
コード長 2,819 bytes
コンパイル時間 1,027 ms
コンパイル使用メモリ 91,040 KB
実行使用メモリ 6,944 KB
最終ジャッジ日時 2024-06-24 12:32:17
合計ジャッジ時間 3,825 ms
ジャッジサーバーID
(参考情報)
judge1 / judge5
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 4
other AC * 103 WA * 12
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

#include <iostream>
#include <vector>
#include <sstream>
#include <functional>
#include <cassert>
#define repeat(i,n) for (int i = 0; (i) < int(n); ++(i))
using ll = long long;
using namespace std;
template <class T> inline void setmin(T & a, T const & b) { a = min(a, b); }
ll powmod(ll x, ll y, ll p) { // O(log y)
assert (y >= 0);
x %= p; if (x < 0) x += p;
ll z = 1;
for (ll i = 1; i <= y; i <<= 1) {
if (y & i) z = z * x % p;
x = x * x % p;
}
return z;
}
ll inv(ll x, ll p) { // p must be a prime, O(log p)
assert ((x % p + p) % p != 0);
return powmod(x, p-2, p);
}
constexpr int mod = 1e9+7;
pair<ll, int> from_string(string const & s) {
ll sum = 0;
int prod = 1;
for (char c : s) {
int d = (c == '0' ? 10 : c - '0');
sum += d;
prod = prod *(ll) d % mod;
}
return { sum, prod };
}
pair<ll, int> addmul(pair<ll, int> a, pair<ll, int> b) {
return { a.first + b.first, a.second *(ll) b.second % mod };
}
int main() {
int k; ll l, r; cin >> k >> l >> r; -- l;
vector<string> str { "" };
vector<ll> width { 0 };
vector<ll> sums { 0 };
vector<int> prods { 1 };
repeat (i,k) {
ostringstream oss;
oss << (i+1)*(i+1);
string s = oss.str();
str.push_back(s);
width.push_back(2 * width.back() + s.length());
ll sum = 2 * sums.back();
int prod = prods.back() *(ll) prods.back() % mod;
tie(sum, prod) = addmul(make_pair(sum, prod), from_string(s));
sums.push_back(sum);
prods.push_back(prod);
if (r <= width.back()) break;
}
setmin<int>(k, width.size() - 1);
function<pair<ll, int> (int, ll)> func = [&](int i, ll r) {
if (i == 0 or r == 0) {
return make_pair(0ll, 1);
} else if (r < width[i]) {
return func(i-1, r);
} else if (r == width[i]) {
return make_pair(sums[i], prods[i]);
} else if (r < width[i] + str[i].length()) {
ll sum = sums[i];
int prod = prods[i];
string s = str[i+1].substr(0, r - width[i]);
return addmul(make_pair(sum, prod), from_string(s));
} else {
assert (r <= width[i] + str[i].length() + width[i]);
ll sum = sums[i];
int prod = prods[i];
string s = str[i+1];
ll nr = r - width[i] - s.length();
return addmul(addmul(make_pair(sum, prod), from_string(s)), func(i-1, nr));
}
};
if (width.back() < r) {
cout << -1 << endl;
} else {
ll lsum; int lprod; tie(lsum, lprod) = func(k, l);
ll rsum; int rprod; tie(rsum, rprod) = func(k, r);
cout << (rsum - lsum) << ' ' << (rprod *(ll) inv(lprod, mod) % mod) << endl;
}
return 0;
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0