照亮数学 T2求助
  • 板块学术版
  • 楼主0tAp
  • 当前回复6
  • 已保存回复7
  • 发布时间2024/4/7 20:31
  • 上次更新2024/4/7 22:00:35
查看原帖
照亮数学 T2求助
758858
0tAp楼主2024/4/7 20:31

大数据T了 只有60分 该怎么优化啊大佬们

#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define dwn(i,a,b) for(int i=(a);i>=(b);i--)
const int N=2e7+10;

int n1,m;
int p[N];
int d[N];
int v[N],prime[N];

void euler(int n)
{
	m=0;
	rep(i,2,n)
	{
		if(v[i]==0)
		{
			v[i]=i,prime[++m]=i;	
			p[i]=i-1;
		}
		rep(j,1,m)
		{
			if(prime[j]>v[i]||prime[j]>n/i)break;
			v[i*prime[j]]=prime[j];
			p[i*prime[j]]=p[i]*(i%prime[j]?prime[j]-1:prime[j]);
		}
	}	
}

double get_ans(int x)
{
	int len=log10(x)+1;
	double k=len*log2(len);
	int idx=floor(n1/x);
	return k+d[idx];
}

void solve()
{
	double ans=0;
	rep(i,1,n1)
	{
		ans+=get_ans(i)*p[i];
		//cout<<ans<<endl;
	}
	printf("%.7lf",ans);
}

int main()
{
	cin>>n1;
	p[1]=1; 
	d[0]=0;
	euler(n1);
	rep(i,1,n1)
	{
		int len=log10(i)+1;
		d[i]=d[i-1]+len;
	}
	solve();
	return 0;
}
2024/4/7 20:31
加载中...