xuxinyi @ 2023-08-01 20:43:01
#include<bits/stdc++.h>
using namespace std;
const int N=1e7+7;
int n;
int a[N],b[N],c2[N];
string s;
string s1="1";
string s2;
string ans="0";
void change(string s,int a[])
{
int temp1=0;
for(int i=s.length()-1;i>=0;i--)
{
a[++temp1]=int(s[i]-'0');
}
}
string cf(string s1,string s2)
{
int len1=s1.length(),len2=s2.length();
change(s1,a);change(s2,b);
s="";
for(int i=1;i<=len1;i++)
{
for(int j=1;j<=len2;j++)
{
c2[i+j-1]+=a[i]*b[j];
c2[i+j]+=c2[i+j-1]/10;
c2[i+j-1]%=10;
}
}
int tp=0;
if(c2[len1+len2]!=0)
{
s+=char(c2[len1+len2]+'0');
}
for(int i=len1+len2-1;i>=1;i--)
{
s+=char(c2[i]+'0');
}
return s;
}
string pluss(string s1,string s2)
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c2,0,sizeof(c2));
string s;
int len1=s1.length(),len2=s2.length();
change(s1,a);change(s2,b);
int len3=max(len1,len2);
for(int i=1;i<=len3;i++)
{
c2[i]+=a[i]+b[i];
c2[i+1]+=c2[i]/10;
c2[i]%=10;
}
if(c2[len3]!=0) s+=char(c2[len3]+'0');
for(int i=len3-1;i>=1;i--)
{
s+=char(c2[i]+'0');
}
return s;
}
int main()
{
ios::sync_with_stdio(false);
cin>>n;
int len=1;
for(int i=1;i<=n;i++)
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c2,0,sizeof(c2));
if(i<10) s2=char(i+'0');
else
{
s2="";
s2+=char(i/10+'0');
s2+=char(i%10+'0');
}
s1=cf(s1,s2);
ans=pluss(ans,s1);
}
cout<<ans<<endl;
return 0;
}
这个代码能怎么优化进1s吗
by chenyilai @ 2023-08-01 20:57:36
改成N=1e3+10
。1e7的话每次memset
就会超时
by xuxinyi @ 2023-08-01 23:18:15
@chenyilai 谢谢!!!
by Kazeno_Akina @ 2023-08-02 11:41:59
考虑卡常技巧。++和--都挪动到字符之前。最后的endl可以不输出。然后数组规模改小。
by xuxinyi @ 2023-08-02 23:22:08
重点是最后一条