This is a very easy problem.
ACMeow loves GTX1920. Now he has m RMB, but no GTX1920s. In the next n days, the unit price of GTX1920 in the ith day is Ci RMB. In other words, in the ith day, he can buy one GTX1920 with Ci RMB, or sell one GTX1920 to gain Ci RMB. He can buy or sell as many times as he wants in one day, but make sure that he has enough money for buying or enough GTX1920 for selling.
Now he wants to know, how many RMB can he get after the n days. Could you please help him?
It’s really easy, yeah?
Input
First line contains an integer T(1 ≤ T ≤20), represents there are T test cases.
For each test case: first line contains two integers n(1 ≤ n ≤2000) and m(0 ≤ m ≤1000000000). Following n integers in one line, the ith integer represents Ci(1 ≤ Ci ≤1000000000).
Output
For each test case, output "Case #X: Y" in a line (without quotes), where X is the case number starting from 1, and Y is the maximum number of RMB he can get mod 1000000007.
Sample Input
2 3 1 1 2 3 4 1 1 2 1 2
Sample Output
Case #1: 3 Case #2: 4
答案可以打到10^9000 上大数
题目大意:给出每天物品的单价和本金,问买卖若干次后资金最多为多少?
解题思路:谷底买,山峰卖,用大数。
被这个大数模板安排了 ans%1e9+7 模的过程会爆int
然后就一直WA 后面改了板子才过的
1 #include <cstdio> 2 #include <cstring> 3 #include <queue> 4 #include <cmath> 5 #include <algorithm> 6 #include <set> 7 #include <iostream> 8 #include <map> 9 #include <stack> 10 #include <string> 11 #include <vector> 12 #define pi acos(-1.0) 13 #define eps 1e-6 14 #define fi first 15 #define se second 16 #define lson l,m,rt<<1 17 #define rson m+1,r,rt<<1|1 18 #define bug printf("****** ") 19 #define mem(a,b) memset(a,b,sizeof(a)) 20 #define fuck(x) cout<<"["<<x<<"]"<<endl 21 #define f(a) a*a 22 #define sf(n) scanf("%d", &n) 23 #define sff(a,b) scanf("%d %d", &a, &b) 24 #define sfff(a,b,c) scanf("%d %d %d", &a, &b, &c) 25 #define sffff(a,b,c,d) scanf("%d %d %d %d", &a, &b, &c, &d) 26 #define pf printf 27 #define FRE(i,a,b) for(i = a; i <= b; i++) 28 #define FREE(i,a,b) for(i = a; i >= b; i--) 29 #define FRL(i,a,b) for(i = a; i < b; i++) 30 #define FRLL(i,a,b) for(i = a; i > b; i--) 31 #define FIN freopen("DATA.txt","r",stdin) 32 #define gcd(a,b) __gcd(a,b) 33 #define lowbit(x) x&-x 34 #pragma comment (linker,"/STACK:102400000,102400000") 35 using namespace std; 36 typedef long long LL; 37 const int INF = 0x7fffffff; 38 const int mod = 1e9 + 7; 39 const int maxn = 1e5 + 10; 40 const int MAXL = 2500; 41 const int MAXN = 9999; 42 const int DLEN = 4; 43 class Big { 44 public: 45 int a[MAXL], len; 46 Big(const int b = 0) { 47 int c, d = b; 48 len = 0; 49 memset(a, 0, sizeof(a)); 50 while(d > MAXN) { 51 c = d - (d / (MAXN + 1)) * (MAXN + 1); 52 d = d / (MAXN + 1); 53 a[len++] = c; 54 } 55 a[len++] = d; 56 } 57 Big(const char *s) { 58 int t, k, index, L; 59 memset(a, 0, sizeof(a)); 60 L = strlen(s); 61 len = L / DLEN; 62 if(L % DLEN) len++; 63 index = 0; 64 for(int i = L - 1; i >= 0; i -= DLEN) { 65 t = 0; 66 k = i - DLEN + 1; 67 if(k < 0) k = 0; 68 for(int j = k; j <= i; j++) t = t * 10 + s[j] - '0'; 69 a[index++] = t; 70 } 71 } 72 Big operator/(const LL &b)const { 73 Big ret; 74 LL down = 0; 75 for(int i = len - 1; i >= 0; i--) { 76 ret.a[i] = (a[i] + down * (MAXN + 1)) / b; 77 down = a[i] + down * (MAXN + 1) - ret.a[i] * b; 78 } 79 ret.len = len; 80 while(ret.a[ret.len - 1] == 0 && ret.len > 1) ret.len--; 81 return ret; 82 } 83 bool operator>(const Big &T)const { 84 int ln; 85 if(len > T.len) return true; 86 else if(len == T.len) { 87 ln = len - 1; 88 while(a[ln] == T.a[ln] && ln >= 0) ln--; 89 if(ln >= 0 && a[ln] > T.a[ln]) return true; 90 else return false; 91 } else return false; 92 } 93 Big operator+(const Big &T)const { 94 Big t(*this); 95 int big = T.len > len ? T.len : len; 96 for(int i = 0; i < big; i++) { 97 t.a[i] += T.a[i]; 98 if(t.a[i] > MAXN) { 99 t.a[i + 1]++; 100 t.a[i] -= MAXN + 1; 101 } 102 } 103 if(t.a[big] != 0) t.len = big + 1; 104 else t.len = big; 105 return t; 106 } 107 Big operator-(const Big &T)const { 108 int big; 109 bool flag; 110 Big t1, t2; 111 if(*this > T) { 112 t1 = *this; 113 t2 = T; 114 flag = 0; 115 } else { 116 t1 = T; 117 t2 = *this; 118 flag = 1; 119 } 120 big = t1.len; 121 for(int i = 0; i < big; i++) { 122 if(t1.a[i] < t2.a[i]) { 123 int j = i + 1; 124 while(t1.a[j] == 0) j++; 125 t1.a[j--]--; 126 while(j > i) t1.a[j--] += MAXN; 127 t1.a[i] += MAXN + 1 - t2.a[i]; 128 } else t1.a[i] -= t2.a[i]; 129 } 130 t1.len = big; 131 while(t1.a[t1.len - 1] == 0 && t1.len > 1) { 132 t1.len--; 133 big--; 134 } 135 if(flag) t1.a[big - 1] = 0 - t1.a[big - 1]; 136 return t1; 137 } 138 LL operator%(const int &b)const { 139 LL d = 0; 140 for(int i = len - 1; i >= 0; i--) d = ((d * (MAXN + 1)) % b + a[i]) % b; 141 return d; 142 } 143 Big operator*(const Big &T) const { 144 Big ret; 145 int i, j, up, temp, temp1; 146 for(i = 0; i < len; i++) { 147 up = 0; 148 for(j = 0; j < T.len; j++) { 149 temp = a[i] * T.a[j] + ret.a[i + j] + up; 150 if(temp > MAXN) { 151 temp1 = temp - temp / (MAXN + 1) * (MAXN + 1); 152 up = temp / (MAXN + 1); 153 ret.a[i + j] = temp1; 154 } else { 155 up = 0; 156 ret.a[i + j] = temp; 157 } 158 } 159 if(up != 0) ret.a[i + j] = up; 160 } 161 ret.len = i + j; 162 while(ret.a[ret.len - 1] == 0 && ret.len > 1) ret.len--; 163 return ret; 164 } 165 void print() { 166 printf("%d", a[len - 1]); 167 for(int i = len - 2; i >= 0; i--) printf("%04d", a[i]); 168 } 169 }; 170 int t, n, m, a[maxn], f[maxn]; 171 int main() { 172 int cas = 1; 173 sf(t); 174 while(t--) { 175 scanf("%d%d", &n, &m); 176 Big ans = m, temp; 177 for (int i = 1 ; i <= n ; i++) sf(a[i]); 178 int i = 1, j, k; 179 while(i <= n) { 180 for (j = i ; j + 1 <= n ; j++) if (a[j + 1] > a[j]) break; 181 if (j == n) break; 182 for (k = j + 1 ; k + 1 <= n ; k++) if (a[k + 1] < a[k]) break; 183 i = k + 1; 184 temp = ans / a[j]; 185 ans = ans + temp * (a[k] - a[j]); 186 } 187 LL ans1 = ans % mod; 188 printf("Case #%d: %lld ", cas++, ans1); 189 } 190 return 0; 191 }