Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- #include <cstring>
- #include <cassert>
- #include <iostream>
- #include <algorithm>
- #include <vector>
- #include <set>
- #define FOR(i, a, b) for (int i = (a); i < (b); ++i)
- #define REP(i, n) FOR (i, 0, n)
- #define _ << " _ " <<
- #define TRACE(x) cerr << #x << " = " << x << endl
- #define debug(...) fprintf(stderr, __VA_ARGS__)
- //#define debug
- //#define TRACE(x)
- using namespace std;
- typedef long long llint;
- const llint BASE = 1e18;
- struct bignum {
- int len;
- __int128 val[2];
- bignum(llint x = 0) {
- memset(val, 0, sizeof val);
- len = 1;
- val[0] = x;
- trim();
- }
- bool operator < (const bignum &b) const {
- if (len != b.len) return len < b.len;
- for (int i = len-1; i >= 0; --i)
- if (val[i] != b.val[i])
- return val[i] < b.val[i];
- return false;
- }
- void trim(void) {
- __int128 tmp = 0;
- REP (i, len) {
- val[i] += tmp;
- tmp = val[i] / BASE;
- val[i] %= BASE;
- }
- for (; tmp > 0; tmp /= BASE)
- val[len++] = tmp % BASE;
- }
- void print(void) {
- for (int i = len-1; i >= 0; --i)
- if (i == len-1)
- printf("%lld", (long long)val[i]);
- else
- printf("%02lld", (long long)val[i]);
- }
- };
- bignum operator + (const bignum &a, const bignum &b) {
- bignum c;
- c.len = max(a.len, b.len);
- REP (i, c.len) c.val[i] = a.val[i] + b.val[i];
- c.trim();
- return c;
- }
- bignum operator * (const bignum &a, const bignum &b) {
- bignum c;
- c.len = a.len + b.len - 1;
- REP (i, a.len) REP (j, b.len)
- c.val[i+j] += a.val[i] * b.val[j];
- c.trim();
- return c;
- }
- const int MAXN = 10000010;
- const int A = 1103515245;
- const int B = 12345;
- const int M = (1LL<<31) - 1;
- int n, r;
- int a[2*MAXN];
- bignum U[2*MAXN], D[2*MAXN];
- bignum P10[65];
- inline string str(char c) {
- string tmp;
- tmp.push_back(c);
- return tmp;
- }
- bignum add_back(const bignum &x, const bignum &y) {
- return x * P10[y.len] + y;
- }
- // inline string get(const string &up, const int &ud,
- // const string &dp, const int &dd) {
- // string udc = ud == -1 ? "" : str(ud + '0');
- // string ddc = dd == -1 ? "" : str(dd + '0');
- // return up + udc + ddc + dp;
- // }
- inline bool cmp(const string &s1, const string &s2) {
- if (s1.size() != s2.size()) return s1.size() < s2.size();
- return s1 < s2;
- }
- int main(void) {
- memset(a, -1, sizeof a);
- scanf("%d%d", &n, &r);
- for (int i = 2; i <= n; ++i) {
- r = ((llint)A*r + B) & M;
- a[i] = ((r >> 16) % 9) + 1;
- }
- P10[0] = 1;
- FOR (i, 1, 60) {
- P10[i] = P10[i-1] * 10;
- P10[i].print();
- putchar('\n');
- }
- bignum X(35), Y(3241);
- add_back(X, Y).print();
- // llint sum = 0;
- // for (int i = n; i >= 1; --i) {
- // if (i > 1) {
- // string tmp;
- // tmp = U[i] + char(a[i] + '0');
- // if (cmp(U[i/2], tmp)) U[i/2] = tmp;
- // tmp = char(a[i] + '0') + D[i];
- // if (cmp(D[i/2], tmp)) D[i/2] = tmp;
- // }
- // string tmp = get(U[2*i], a[2*i], D[2*i+1], a[2*i+1]);
- // if (cmp(ans[i], tmp)) ans[i] = tmp;
- // tmp = get(U[2*i+1], a[2*i+1], D[2*i], a[2*i]);
- // if (cmp(ans[i], tmp)) ans[i] = tmp;
- // }
- // printf("%lld\n", sum);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement