首页 > 学院 > 开发设计 > 正文

BZOJ 2190 [SDOI2008]仪仗队 欧拉函数

2019-11-08 19:46:28
字体:
来源:转载
供稿:网友

欧拉函数 euler(x)代表小于等于x的数中与x互质的数的数目 euler(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…(1-1/pn) 其中 p1 p2 p3 … pn 为x的质因数

#include <cstdio>#include <algorithm>#include <cstring>#include <cmath>#include <vector>#include <map>#include <set>#define MAXN 40005#define ls ch[o][0]#define rs ch[o][1]#define key ch[ch[root][1]][0]#define max(a,b) ((a)>(b)?(a):(b))#define min(a,b) ((a)<(b)?(a):(b))using namespace std;const double eps=1e-8;const int INF=1e9;inline int read(){ int f=1,t=0;char ch=getchar(); while(ch>'9'||ch<'0'){if(ch=='-') f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){t=t*10+ch-'0',ch=getchar();} return t*f;}int n;int e[MAXN];//euler(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…(1-1/pn)void euler(){ for(int i=1;i<=n;i++) e[i]=i; for(int i=2;i<=n;i++) { if(e[i]==i)//是素数 for(int j=i;j<=n;j+=i)//j起始值为i e[j]=e[j]-e[j]/i; }}int main(){ int ans=0; scanf("%d",&n); euler(); for(int i=1;i<n;i++) ans+=e[i]; PRintf("%d",ans*2+1); return 0;}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表