蒟蒻真的是太渣了……尤其是数学部分被诸多大佬虐的渣都不剩……
所以今天蒟蒻我痛定思痛决定向数学发起冲锋!复习一下欧拉函数先……/糊脸/糊脸
欧拉函数定义:1~N中和N互质的数的个数被称为欧拉函数,记为φ(N)。
欧拉函数一般公式:φ(N)=
证明:设p是N的质因子,1~N中p的倍数一共有N/p个,
同理,若q也是N的质因子,则1~N中q的倍数有N/q个。
如果我们把这N/p和N/q个数去掉,其中q与p的公倍数被排除了两次,要加回来。
所以1~N中不与N含有共同质因子p或q的数的个数为:N*(1-1/p)(1-1/q)
(以上证明用到了容斥原理)
证毕。
给道模板题
题目大意:给出一段区间,求出这段区间的所有数的欧拉函数值和。
彻头彻尾的板子题。不解释,上代码!
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int phi[3000003];
int main()
{
int a,b;
long long ans=0;
while(scanf("%d %d",&a,&b)!=EOF)
{
ans=0;
for(int i=2;i<=b;++i)
phi[i]=i;
for(int i=2;i<=b;++i)
if(phi[i]==i)
for(int j=i;j<=b;j+=i)
phi[j]=phi[j]/i*(i-1);
for(int i=a;i<=b;++i)
ans+=(long long)phi[i];
printf("%lld\n",ans);
}
return 0;
}
#include<cstdio>
#include<cstring>
using namespace std;
int phi[3000003];
int main()
{
int a,b;
long long ans=0;
while(scanf("%d %d",&a,&b)!=EOF)
{
ans=0;
for(int i=2;i<=b;++i)
phi[i]=i;
for(int i=2;i<=b;++i)
if(phi[i]==i)
for(int j=i;j<=b;j+=i)
phi[j]=phi[j]/i*(i-1);
for(int i=a;i<=b;++i)
ans+=(long long)phi[i];
printf("%lld\n",ans);
}
return 0;
}