思路:我用c[i]>c[i-1]的时候我就可以在昨天买然后在今天卖
因为此题是求最后的值取余1e9+7所以要用大数求因为最后数值可能很大所以要用压位
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
typedef long long int ll;
const ll mod = 1e9;
ll sum[6000];
int len,j;
ll c;
ll a[2005];
int main(){
int t,n;
ll m;
scanf("%d",&t);
for(int casei = 1; casei <= t; casei++){
memset(sum,0,sizeof(sum));
sum[0] = 1;
len = 1;
scanf("%d%I64d",&n,&m);
for(c=0,j=0; j < len; j++){
ll p= sum[j]*m+c;
sum[j]= p % mod;
c=p / mod;
}
sum[j] = c;
if(c)
len++;
for(int i = 1; i <= n; i++)
scanf("%I64d",&a[i]);
for(int i = 2; i <= n; i++)
if(a[i]>a[i-1]){
ll p = 0;
for(int j = len-1; j >= 0; j--){
p = p*mod+sum[j];
sum[j] = p/a[i-1];
p%=a[i-1];
}
ll v = p;
ll c = 0;
for(j = 0; j < len; j++){
p = sum[j]*a[i]+c;
sum[j] = p%mod;
c = p/mod;
}
sum[j] = c;
if(c)
len++;
sum[0] += v;
for(j = 0; j < len; j++)
if(sum[j]>=mod){
sum[j+1] += sum[j]/mod;
sum[j]%=mod;
}
else
break;
if(j==len)
len++;
}
ll ans = 0;
for(int i = len-1; i >= 0; i--){
ans = ans*mod+sum[i];
ans %= mod+7;
}
printf("Case #%d: %I64d\n",casei,ans);
}
return 0;
}