社区讨论
爆0求助
P1009[NOIP 1998 普及组] 阶乘之和参与者 2已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @m0dyx1kv
- 此快照首次捕获于
- 2024/08/28 22:45 2 年前
- 此快照最后确认于
- 2025/11/04 22:08 4 个月前
rt,以下是我的代码,本人之前没学过高精,恳请指点
CPP#include<bits/stdc++.h>
using namespace std;
const int pp=5e6+7;
int s[pp],x[pp],ans[pp],c[pp],n;
int main( ){
cin>>n;
ans[1]=1;
int xlen=1;
x[1]=1;
for(int i=2;i<=n;i++){
int xx=i,cnt=0;
while(xx){
s[++cnt]=xx%10;
xx/=10;
}
int slen=cnt;
for(int l=1;l<=xlen;l++){
for(int r=1;r<=slen;r++){
c[l+r-1]=x[l]*s[r];
c[l+r]+=c[l+r-1]/10;
c[l+r-1]%=10;
}
}
int k;
for(k=10000;k>=1&&c[k]==0;k--);
int clen=k;
for(k=10000;k>=1&&ans[k]==0;k--);
int anslen=k;
//printf("q%d %dq",anslen,clen);
for(int i=1;i<=max(anslen,clen);i++){
ans[i]=ans[i]+c[i];
ans[i+1]+=ans[i]/10;
ans[i]%=10;
}
for(int i=1;i<=clen;i++){
x[i]=c[i];
}
xlen=clen;
memset(c,0,sizeof(c));
/*
cout<<endl;
for(k=100;k>=1&&ans[k]==0;k--);
for(k;k>=1;k--){
cout<<ans[k];
}
*/
}
int k;
for(k=10000;k>=1&&ans[k]==0;k--);
for(k;k>=1;k--){
cout<<ans[k];
}
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...