UVA 10820 打表 数论欧拉phi

UVA 10820 send a table

数论欧拉phi打表题
题意
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
大意概述:
问题可以转化。
根据对称性,我们可以假设x<y,当x=y时,满足条件的只有(1, 1)。
设f(n)为 集合S{(x, y) | x<y且x、y互素} 的个数,则所求答案为2f(n)+1
f(n)表达式为:在这里插入图片描述
代码:

//  Created by user on 2020/5/15.
//  Copyright © 2020 user. All rights reserved.
//

#include <iostream>
#include <cstdio>
using namespace std;

int phi[50005];
int oula(int op){
    int res=op;
    int x = op;
    for(int i=2;i*i<=op;i++){
        if(op % i == 0){
            res = res / i * (i-1);
            while(x % i ==0) x /= i;
        }
    }
    if(x>1) res = res/x*(x-1);
    
    return res;
}

int table_oula(int n){
    phi[1]=1;
    for(int i=2;i<=n;i++){
        if(phi[i]==0)
            for(int j=i;j<=n;j+=i){
                if(phi[j]==0) phi[j] = j;
                phi[j] = phi[j] / i * (i-1);
            }
    }
    return 0;
}
int main(){
    int n;
    
    while(scanf("%d",&n)){
        if(n==0) break;
        int ans=0;
        for(int i=1;i<=n;i++) phi[i]=0;
        /*for(int i=2;i<=n;i++){
            ans+=oula(i);
        }*/
        table_oula(n);
        for(int i=2;i<=n;i++){
            ans+=phi[i];
        }
        printf("%d\n",2*ans+1);
    }
    return 0;
}

分别算每一个小于n的数的欧拉时间太长,过不了。
只能像素数筛法那样,处理出来素数表才可以。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值