Light OJ 1007 Mathematically Hard [欧拉函数+前缀和]【数论】

本文探讨了一类看似复杂的数学问题——求特定区间内整数的欧拉函数之和,并提供了一个通过计算机辅助解决此类问题的有效算法。文章详细介绍了如何预处理数据以快速计算这一和值,包括使用欧拉函数及其性质。

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

Mathematically Hard

Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%lld & %llu
Submit

Status
Description
Mathematically some problems look hard. But with the help of the computer, some problems can be easily solvable.

In this problem, you will be given two integers a and b. You have to find the summation of the scores of the numbers from a to b (inclusive). The score of a number is defined as the following function.

score (x) = n2, where n is the number of relatively prime numbers with x, which are smaller than x

For example,

For 6, the relatively prime numbers with 6 are 1 and 5. So, score (6) = 22 = 4.

For 8, the relatively prime numbers with 8 are 1, 3, 5 and 7. So, score (8) = 42 = 16.

Now you have to solve this task.

Input
Input starts with an integer T (≤ 105), denoting the number of test cases.

Each case will contain two integers a and b(2 ≤ a ≤ b ≤ 5 * 106).

Output
For each case, print the case number and the summation of all the scores from a to b.

Sample Input
3
6 6
8 8
2 20
Sample Output
Case 1: 4
Case 2: 16
Case 3: 1237


题目大意 就是求a~b的所有数的欧拉函数的和

题解:数据量5e6 预处理一下 将所有欧拉函数的平方求出 在处理一下前缀和 即可 因为后面的大数会爆long long 所以要用unsign long long

附本题代码

——————————————————

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#include <malloc.h>
#include <ctype.h>
#include <math.h>
#include <string>
#include <iostream>
#include <algorithm>
#include <map>
#include <vector>
#include <set>

using namespace std;

#define LL unsigned long long int

/*
const double eps = 1e-7;
const double Pi = acos(-1.0);
*/

LL phi[5000500];


void phi_table()  //欧拉函数。。。
{
    int i,j;
    for(i=2; i<=5e6; i++)
        phi[i]=0;
    phi[1]=1;
    for(i=2; i<=5e6; i++)
        if(!phi[i])
            for(j=i; j<=5e6; j+=i)
            {
                if(!phi[j])
                    phi[j]=j;
                phi[j]=phi[j]/i*(i-1);
            }
    phi[0]=0;
}
void init()
{
    for(int i=2; i<5000001; i++)
    {
        phi[i]=phi[i-1]+phi[i]*phi[i] ;
    }
    return ;
}

int main()
{
    phi_table();
    init();
    int t,aa,bb,p=0;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&aa,&bb);

        printf("Case %d: %llu\n",++p,phi[bb]-phi[aa-1]);
    }
    return 0;
}
### XTUOJ 欧拉函数题目解题思路 #### 题目描述 XTU-OJ 1355-Euler’s Totient Function 是一道关于欧拉函数的经典题目。此题要求实现并计算给定整数 \( n \) 的欧拉函数值 φ(n),即小于等于 \( n \) 并且与 \( n \) 互质的正整数的数量[^1]。 #### 解题方法概述 为了高效求解单个或多个查询中的欧拉函数,通常采用线性筛法来预处理所有可能的结果。这种方法不仅适用于单独数值的查询,也适合批量数据的快速响应。 #### 关键算法解释 对于任意自然数 \( n \),其欧拉函数可以通过下面公式得到: \[φ(n)=n(1−\frac{1}{p_1})(1-\frac{1}{p_2})...(1-\frac{1}{p_k})\] 其中 \( p_i \) 表示能整除 \( n \) 的不同质因数。当遇到新的素因子时更新当前累积乘积即可完成一次有效的状态转移操作。 #### 实现细节说明 下面是基于上述理论的一个Python版本的具体实现方式: ```python def euler_sieve(max_n): phi = list(range(max_n + 1)) for i in range(2, max_n + 1): if phi[i] == i: # 如果i还是初始值,则它必然是一个素数 for j in range(i, max_n + 1, i): phi[j] = phi[j] // i * (i - 1) return phi if __name__ == "__main__": N = int(input()) phis = euler_sieve(N) result = [] for _ in range(int(input())): num = int(input().strip()) result.append(str(phis[num])) print("\n".join(result)) ``` 这段代码首先定义了一个名为 `euler_sieve` 函数用于构建欧拉函数表;接着读取输入参数N表示最大范围内的数字,并调用该函数获取对应的phi列表;最后循环接收多组测试案例并将结果存储起来一次性输出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值