P00575. 求约数之和3之完美数

下面这个代码TLE了,因为做除法的速度比做乘法慢4到5倍 。
#include <bits/stdc++.h>
using namespace std;
long long a,b,ans,f[10000001];
int main()
{
cin>>a>>b;
for(long long i=1;i<=b/i;i++)
for(long long j=i;j<=b/i;j++)
{
if(i==j)
f[i*j]+=i;
else
f[i*j]+=(i+j);
}
for(int i=a;i<=b;i++)
ans=ans+abs(2*i-f[i]);
cout<<abs(ans);
return 0;
}
这个程序过了
#include <bits/stdc++.h>
using namespace std;
long long a,b,ans,f[10000001];
int main()
{
cin>>a>>b;
for(long long i=1;i*i<=b;i++)
{
for(long j=i;i*j<=b;j++)
{
if(i==j)
f[i*j]+=i;
else
f[i*j]+=(i+j);
}
}
for(long long i=a;i<=b;i++)
ans+=abs(i*2-f[i]);
cout<<abs(ans);
return 0;
}
这个也行。
#include <bits/stdc++.h>
using namespace std;
long long a,b,ans,f[10000001];
int main()
{
cin>>a>>b;
int tot=sqrt(b);
for(int i=1;i<=tot;i++)
{
for(int j=i;i*j<=b;j++)
{
if(i==j)
f[i*j]+=i;
else
f[i*j]+=(i+j);
}
}
for(int i=a;i<=b;i++)
ans+=abs(i*2-f[i]);
cout<<abs(ans);
return 0;
}

浙公网安备 33010602011771号