1 #include <bits/stdc++.h>
2 using namespace std;
3 inline int read(){
4 int x=0;int f=1;char ch=getchar();
5 while(!isdigit(ch)) {if(ch=='-')f=-1;ch=getchar();}
6 while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();}
7 return x*f;
8 }
9 const int MAXN=1e6+10;
10 const int mod=10007;
11 int f[3][MAXN]={},n,m,a[MAXN],sum[MAXN];
12 inline bool check(int xx){
13 int sum=0;
14 int summ=0;
15 for(int i=1;i<=n;i++){
16 if(a[i]>xx) return 0;
17 sum+=a[i];
18 if(sum>xx){
19 sum=a[i];summ++;
20 }
21 }
22 return summ<=m;
23 }
24 inline int erfen(){
25 int leftt=1;int rightt=100000017;
26 while(leftt+1<rightt){
27 int mid=(rightt+leftt)>>1;
28 if(check(mid)) rightt=mid;
29 else leftt=mid;
30 }
31 if(check(leftt)) return leftt;
32 else return rightt;
33 }
34 void init(){
35 n=read();m=read();
36 for(int i=1;i<=n;i++){
37 a[i]=read();
38 sum[i]=sum[i-1]+a[i];
39 }
40 }
41 void dp(){
42 int k=erfen();
43 cout<<k<<' ';
44 int cnt=1;
45 int ans=0;
46 for(int i=0;i<=m;i++){
47 int sumf=0;int mink=0;//sumf表示f的总和
48 for(int j=1;j<=n;j++){
49 if(i==0){
50 if(sum[j]<=k) f[cnt][j]=1;
51 else f[cnt][j]=0;
52 }
53 else{
54 while(sum[j]-sum[mink]>k){
55 sumf-=f[cnt^1][mink];
56 sumf=(sumf+mod)%mod;
57 mink++;
58 }
59 f[cnt][j]=sumf;
60 f[cnt][j]%=mod;
61 sumf+=f[cnt^1][j];
62 sumf%=mod;
63 }
64 }
65 ans+=f[cnt][n];
66 ans%=mod;
67 cnt^=1;
68 }
69 cout<<ans<<endl;
70 }
71 int main(){
72 //freopen("All.in","r",stdin);
73 //freopen("a.out","w",stdout);
74 init();
75 dp();
76 return 0;
77 }
78
79 代码