UESTC - 1724 GCD区间求和

本文深入探讨了欧拉函数的性质及其应用,通过求解特定范围内所有整数的欧拉函数值,来解决数学问题。文章展示了如何利用C++编程实现高效的欧拉函数计算,并提供了完整的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

依然是神奇的欧拉函数
若GCD(n,i)=k
则GCD(n/k,i/k)=1,
令i/k=x,有GCD(n/k,x)=1,
→k*GCD(n/k,x)=1中x的个数 = GCD(n,i)=k的和
范围就是求n的所有因子k

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e6+11;
typedef unsigned long long ll;
ll phi[maxn];
void euler(int n){
    for(int i = 1; i <= n; i++){
        phi[i]=i;
    }
    for(int i = 2; i <= n; i++){
        if(phi[i]==i){
            for(int j = i; j <= n; j+=i){
                phi[j]=phi[j]/i*(i-1);
            }
        }
    }
}
vector<int> P;
void chai(int n){
    P.clear();
    for(ll i = 1; i*i <= n; i++){
        if(n%i==0){
            P.push_back(i);
            if(n/i!=i) P.push_back(n/i);
        }
    }
}
int a[maxn],n;
int main(){
    euler(maxn-1);
    while(scanf("%d",&n)!=EOF){
        ll ans=0;
        for(int i = 1; i <= n; i++) scanf("%d",&a[i]);
        for(int i = 1; i <= n; i++){
            chai(a[i]);
            for(int j = 0; j < P.size(); j++){
                ans+=phi[a[i]/P[j]]*P[j];
            }
            ans-=a[i];
        }
        printf("%llu\n",ans);
    }
    return 0;
}

转载于:https://www.cnblogs.com/caturra/p/8271095.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值