记录编号 |
600147 |
评测结果 |
AAAATAAAAT |
题目名称 |
[BZOJ 2818]GCD |
最终得分 |
80 |
用户昵称 |
wxs |
是否通过 |
未通过 |
代码语言 |
C++ |
运行时间 |
4.936 s |
提交时间 |
2025-04-16 21:47:59 |
内存使用 |
46.31 MiB |
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
int n;
long long k=0;
long long ph[10000010];
int p[10000010],v[10000010];
int m=0;
void primes(int a)
{
memset(v,0,sizeof(v));
for(int i=2;i<=a;i++)
{
if(!v[i]) v[i]=i,p[++m]=i;
for(int j=1;j<=m;j++)
{
if(v[i]<p[j]) break;
if(i*p[j]>a) break;
v[i*p[j]]=p[j];
}
}
return;
}
int phi(int a)
{
long long ans=a;
for(int i=2;i*i<=a;i++)
{
if(a%i==0)
{
ans=ans/i*(i-1);
while(a%i==0) a/=i;
}
}
if(a>1) ans=ans/a*(a-1);
return ans;
}
int main()
{
freopen("gcd_prime.in","r",stdin);
freopen("gcd_prime.out","w",stdout);
cin>>n;
primes(n);
for(int i=1;2*i<=n;i++) ph[i]=phi(i);
for(int i=1;i<=m;i++)
{
for(int j=1;p[i]*j<=n;j++)
{
if(j==1) k+=1;
else k+=ph[j]*2;
//cout<<phi(j)<<' ';
}
//cout<<endl;
//if(n%p[i]==0) k+=phi(n/p[i]);
}
//k=(k-m)*2+m;
cout<<k<<endl;
return 0;
}