不用高精度60分,用了高精度还是60分,但WA的点居然还不一样()
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int ans[1000],la=0;
int n,t,p[10];
string s="#",c;
void dfs(int last,int pleas);
void f();
int main(){
scanf("%d%d",&n,&t);
cin>>c;
s+=c;
p[0]=n;
dfs(0,t);
for (int i=0;i<la;i++) printf("%d",ans[i]);
return 0;
}
void dfs(int last,int pleas){
if (pleas==0){
f();
return;
}
for (int i=last+1;i<=n-t;i++){
p[pleas]=i;
dfs(i,pleas-1);
}
}
void f(){
int temp[1000]={0},lt=1,num[1000]={0},ln=0,num_[1000]={0},ln_=0,ans_[1000]={0},la_=0;
temp[0]=1;
int xb=t;
for (int l=1;l<=n;l++){
num[ln++]=s[l]-'0';
if (l==p[xb]){
xb--;
for(int i=0;i<ln;i++) num_[ln-i-1]=num[i];
memset(num,0,sizeof(num));
ln_=ln;
ln=0;
for(int i=0;i<lt;i++) ans_[lt-i-1]=temp[i];
memset(temp,0,sizeof(temp));
la_=lt;
lt=0;
for (int i=0;i<ln_;i++)
for (int j=0;j<la_;j++){
temp[i+j]+=num_[i]*ans_[j];
temp[i+j+1]+=temp[i+j]/10;
temp[i+j]=temp[i+j]%10;
}
lt=ln_+la_;
while (temp[lt-1]==0 && lt>1)
lt-=1;
memset(ans_,0,sizeof(ans_));
for(int i=0;i<lt;i++) ans_[lt-i-1]=temp[i];
la_=lt;
memcpy(temp,ans_,sizeof(temp));
memset(num,0,sizeof(num));
ln_=0;
}
}
if (la_>la){
la=la_;
memcpy(ans,ans_,sizeof(ans));
return;
}else if (la_==la)
for (int i=0;i<la_;i++)
if (ans[i]!=ans_[i]){
if (ans_[i]>ans[i])
memcpy(ans,ans_,sizeof(ans));
return;
}
}