社区讨论
高精比单精少了30分,蒟蒻求解于dalao
P1018[NOIP 2000 提高组] 乘积最大参与者 5已保存回复 6
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 6 条
- 当前快照
- 1 份
- 快照标识符
- @mi6yaztm
- 此快照首次捕获于
- 2025/11/20 12:48 4 个月前
- 此快照最后确认于
- 2025/11/20 12:48 4 个月前
#include<bits/stdc++.h>
using namespace std;
const int maxn=101;
long long f[maxn][maxn];
long long a1[maxn],b1[maxn],c[maxn];
string s;
long long g[maxn];
long long cut(long long l,long long r)
{
long long end=0;
for(long long i=l;i<=r;i++)
end=end10+g[i];
return end;
}
void strint(const int &int_temp,string &string_temp)
{
stringstream stream;
stream<<int_temp;
string_temp=stream.str();
} long long cifang(long long a,long long b) { if(b==0) return 1; else if(b==1) return a; else { int qq=a; for(long long i=2;i<=b;i++) a=qq; return a; } } long long chengfa(long long a,long long b) { memset(a1,0,sizeof(a1)); memset(b1,0,sizeof(b1)); memset(c,0,sizeof(c)); string s1,s2; strint(a,s1); strint(b,s2); long long la=s1.size(); long long lb=s2.size(); if(s1=="0"||s2=="0") return 0; for(int i=1;i<=la;i++) a1[i]=s1[la-i]-'0'; for(int i=1;i<=lb;i++) b1[i]=s2[lb-i]-'0'; for(int i=1;i<=la;i++) for(int j=1;j<=lb;j++) c[i+j-1]+=a1[i]*b1[j]; for(long long i=1;i<la+lb;i++) { if(c[i]>=10) { c[i+1]+=c[i]/10; c[i]%=10; } } long long ans=0; long long lc=la+lb; while(c[lc]==0&&lc>1)lc--; for(long long i=lc;i>=1;i--) { ans+=c[i]*cifang(10,i-1); } return ans; } int main() { long long n,l; cin>>n>>l>>s; for(long long i=1;i<=n;i++)g[i]=s[i-1]-'0'; for(long long i=1;i<+n;i++) f[i][0]=cut(1,i); for(long long i=2;i<=n;i++) for(long long j=1;j<=min(i-1,l);j++) for(long long k=j;k<i;k++) f[i][j]=max(f[i][j],chengfa(f[k][j-1],cut(k+1,i))); cout<<f[n][l]; }
} long long cifang(long long a,long long b) { if(b==0) return 1; else if(b==1) return a; else { int qq=a; for(long long i=2;i<=b;i++) a=qq; return a; } } long long chengfa(long long a,long long b) { memset(a1,0,sizeof(a1)); memset(b1,0,sizeof(b1)); memset(c,0,sizeof(c)); string s1,s2; strint(a,s1); strint(b,s2); long long la=s1.size(); long long lb=s2.size(); if(s1=="0"||s2=="0") return 0; for(int i=1;i<=la;i++) a1[i]=s1[la-i]-'0'; for(int i=1;i<=lb;i++) b1[i]=s2[lb-i]-'0'; for(int i=1;i<=la;i++) for(int j=1;j<=lb;j++) c[i+j-1]+=a1[i]*b1[j]; for(long long i=1;i<la+lb;i++) { if(c[i]>=10) { c[i+1]+=c[i]/10; c[i]%=10; } } long long ans=0; long long lc=la+lb; while(c[lc]==0&&lc>1)lc--; for(long long i=lc;i>=1;i--) { ans+=c[i]*cifang(10,i-1); } return ans; } int main() { long long n,l; cin>>n>>l>>s; for(long long i=1;i<=n;i++)g[i]=s[i-1]-'0'; for(long long i=1;i<+n;i++) f[i][0]=cut(1,i); for(long long i=2;i<=n;i++) for(long long j=1;j<=min(i-1,l);j++) for(long long k=j;k<i;k++) f[i][j]=max(f[i][j],chengfa(f[k][j-1],cut(k+1,i))); cout<<f[n][l]; }
回复
共 6 条回复,欢迎继续交流。
正在加载回复...