您的位置:首页 > 其它

[欧拉函数] bzoj2190: [SDOI2008]仪仗队

2018-03-29 20:56 399 查看
bzoj2190: [SDOI2008]仪仗队https://www.lydsy.com/JudgeOnline/problem.php?id=2190

欧拉函数

可以看出能够看到的点都是不会被前面的点挡住的(<-废话)

那就是求N内有多少个质数

直接欧拉函数跑线性筛选就ok

满足左右对称答案记得乘2

#include <cstdio>
#include <cstring>
using namespace std;
int pri[41000],prime[41000],pr,n;
bool v[41000];
void get()
{
for (int i=2;i<=n;i++)
{
if (v[i])
{
prime[++pr]=i;
pri[i]=i-1;
}
for (int j=1;(j<=pr)&&(prime[j]*i<=n);j++)
{
v[i*prime[j]]=false;
if (i%prime[j]==0)
{
pri[i*prime[j]]=pri[i]*prime[j];
break;
}
else
{
pri[i*prime[j]]=pri[i]*(prime[j]-1);
}
}
}
}
int main()
{
scanf("%d",&n);
memset(v,true,sizeof(v));
get();
int ans=3;
for (int i=1;i<n;i++) ans+=pri[i]*2;
if (n==1) printf("1\n"); else printf("%d\n",ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: