Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
up#define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <time.h> #include <stack> #include <cmath> #include <set> #include <map> #include <queue> #include <string> #include <string.h> #include <vector> #include <stdio.h> #include <algorithm> using namespace std; typedef unsigned long long llu; typedef long long lld; const int MAXN = 2e5 + 10; const int INF = 1e9; const int BASE = 10000; int gcd(int a, int b) { if (a == 0)return b; if (b == 0)return a; if (a%b == 0)return b; return gcd(b, a%b); } struct BigNum { static int MOD_LEN; int len; int dig[256]; BigNum() { Clear(); } void Clear() { len = 1; memset(dig, 0, sizeof(dig)); } void Mod() { while (len > MOD_LEN) { len--; dig[len] = 0; } } void SetNum(const char* s) { Clear(); int slen = strlen(s); len = 0; for (int i = slen - 1; i >= 0;) { int d = 0; int t = 1; for (int j = 0; j < 4 && i >= 0; j++, i--) { d += t * (s[i] - '0'); t *= 10; } dig[len] = d; len++; } RemoveLeadingZero(); Mod(); } void SetNum(int n) { Clear(); if (n == 0) { return; } len = 0; while (n) { dig[len] = n % BASE; n /= BASE; len++; } Mod(); } void Print() { printf("%d", dig[len - 1]); for (int i = len - 2; i >= 0; i--) { printf("%04d", dig[i]); } } int Compare(const BigNum& other) const { if(len<other.len) { return -1; } else if (len > other.len) { return 1; } else { for (int i = len - 1; i >= 0; i--) { if (dig[i] != other.dig[i]) { return dig[i] - other.dig[i]; } } return 0; } } void operator++() { dig[0]++; int i = 0; while (dig[i] >= BASE) { dig[i] -= BASE; dig[i + 1]++; i++; } if (dig[len]) { len++; } Mod(); } void operator*=(const BigNum& other) { lld dc[256] = { 0 }; int lenc = len + other.len; if (lenc > MOD_LEN) { lenc = MOD_LEN; } for (int i = 0; i < len && i < MOD_LEN; i++) { for (int j = 0; j < other.len && i + j < MOD_LEN; j++) { dc[i + j] += dig[i] * other.dig[j]; } } for (int i = 0; i < lenc; i++) { if (dc[i] >= BASE) { dc[i + 1] += dc[i] / BASE; dc[i] %= BASE; } dig[i] = dc[i]; } len = lenc; RemoveLeadingZero(); Mod(); } void RemoveLeadingZero() { while (len > 1 && dig[len - 1] == 0) { len--; } } void operator+=(const BigNum& other) { len = max(len, other.len); for (int i = 0; i < len; i++) { dig[i] += other.dig[i]; if (dig[i] >= BASE) { dig[i + 1]++; dig[i] -= BASE; } } if (dig[len]) { len++; } Mod(); } void operator/=(int d) { if (d == 1) { return; } for (int i = len - 1; i > 0; i--) { dig[i - 1] += (dig[i] % d)*BASE; dig[i] /= d; } if (dig[0] % d != 0) { while (1) { cout << "error" << endl; } } dig[0] /= d; RemoveLeadingZero(); Mod(); } BigNum operator-(const BigNum& other) const { BigNum c; c.len = len; for (int i = 0; i < len; i++) { c.dig[i] = dig[i] - other.dig[i]; } for(int i=0;i<len;i++) { if (c.dig[i] < 0) { c.dig[i] += BASE; c.dig[i + 1]--; } } c.RemoveLeadingZero(); c.Mod(); return c; } }; int BigNum::MOD_LEN = 1; BigNum f[16][16]; void ReadBigNum(BigNum& N) { char s[256]; scanf("%s", s); N.SetNum(s); } BigNum Pow(BigNum n, int m) { BigNum ret; ret.SetNum(1); while (m) { if (m & 1) { ret *= n; } n *= n; m >>= 1; } return ret; } BigNum Fun(const BigNum& x, const BigNum* a, int m) { BigNum result = a[m]; for (int i = m - 1; i >= 0; i--) { result *= x; result += a[i]; } return result; } BigNum SolveSimple(const BigNum& L, int len, const BigNum* a, int m) { BigNum tempL = L; for (int i = 0; i <len; i++) { f[0][i] = Fun(tempL, a, m); ++tempL; } BigNum ans; return ans; } int DigSqrSum(int x, int last) { int ret = 0; while (last > 0) { last--; int d = x % 10; x /= 10; ret += d * d; } return ret; } int GetSqrSum(const BigNum& n, int last) { int ans = 0; for (int i = 0; i < n.len && last>0; i++) { if (last >= 4) { ans += DigSqrSum(n.dig[i],4); last -= 4; } else { ans += DigSqrSum(n.dig[i], last); last = 0; } } return ans; } void SolveCombination(int m, const BigNum* a, const BigNum& L, int k, int last) { if (k <= m + 3) { SolveSimple(L, k, a, m); for (int i = 0; i < k; i++) { int sqrSum = GetSqrSum(f[0][i], last); printf("%d\n", sqrSum); } return; } SolveSimple(L, m + 1, a, m); for (int i = 0; i < m + 1; i++) { int sqrSum = GetSqrSum(f[0][i], last); printf("%d\n", sqrSum); } BigNum c[16]; for (int i = 1; i <= m; i++) { for (int j = i; j <= m; j++) { f[i][j] = f[i - 1][j] - f[i - 1][j - 1]; } } for (int i = 0; i <= m; i++) { c[i] = f[i][m]; } for (int i = m + 1; i < k; i++) { for (int j = m-1; j >= 0; j--) { c[j] += c[j + 1]; } int ans = GetSqrSum(c[0], last); printf("%d\n", ans); } } lld Brt(const BigNum& N, int m) { lld ans = 0; for (int i = 1; i <= N.dig[0]; i++) { lld x = 1; for (int j = 0; j < m; j++) { x *= i; } ans += x; } return ans; } int main(int argc, char *argv[]) { int T; cin >> T; while (T--) { int m; cin >> m; BigNum L; ReadBigNum(L); int k; int last; cin >> k >> last; BigNum::MOD_LEN = (last + 3) / 4; BigNum a[16]; for (int i = m; i >= 0; i--) { ReadBigNum(a[i]); } SolveCombination(m, a, L, k, last); } return 0; } /* */ Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator