LightOJ 1007 欧拉函数

4 篇文章 0 订阅
1 篇文章 0 订阅

题意:给你两个数a,b,求a到b之间的数的欧拉函数值之和。
欧拉函数φ(x) 表示不大于x的与x互质的数的个数。
φ(x)= x(1-1/P1)(1-1/P2)(1-1/P3)……其中P1,P2,P3…是x的质因数。
又可以表示成φ(x)= x*(P1-1)/P1*(P2-1)/P2*(P3-1)/P3……

预处理出φ(x),然后记录前缀和,假设F[n]=∑(φ(i))(i=1..n),则最终答案为F[b]-F[a-1]

超级丑的代码:
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define Up(a,b,c) for(ull a(b),end##a(c);a<=end##a;++a)
#define Down(a,c,b) for(ull a(b),end##a(c);a>=end##a;--a)
#define sUp(a,c,b) for(ull a(b),end##a(c);a<=end##a;++a)
#define sDown(a,b,c) for(ull a(b),end##a(c);a>=end##a;--a)
typedef unsigned long long ull;
using namespace std;
const ull N=5000000;
ull Phi[5050500];//结果很大,要用unsigned long long!!!!!!!!!!
void Ycl_phi(){
    Phi[1]=1;
    Up(i,2,N){
        if(!Phi[i]){
            for(ull j=i;j<=N;j+=i){
                if(!Phi[j])Phi[j]=j;
                (Phi[j]/=i)*=(i-1);
            };
        }

        Phi[i]*=Phi[i];
        Phi[i]+=Phi[i-1];
    }
}
int main(){
    Ycl_phi();
    ull T,l,r;
    scanf("%llu",&T);
    Up(t,1,T){
        scanf("%llu%llu",&l,&r); 
        printf("Case %llu: %llu\n",t,Phi[r]-Phi[l-1]);
    }

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值