• ligtoj 1007


    1007 - Mathematically Hard
    PDF (English) Statistics Forum
    Time Limit: 2 second(s) Memory Limit: 64 MB
    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
    Output for Sample Input
    3
    6 6
    8 8
    2 20
    Case 1: 4
    Case 2: 16
    Case 3: 1237
    Note
    Euler's totient function applied to a positive integer n is defined to be the number of positive integers less than or equal to n that are relatively prime to n. is read "phi of n."

    思路: 用欧拉函数预处理出phi,  然后求下前缀和。

    #include<iostream>
    #include<cmath>
    #include<cstring>
    #include<algorithm>
    #include<cstdio>
    using namespace std;
    
    typedef unsigned long long ull;
    
    ull phi[5000100];
    
    void getPhi(){
        
        phi[1] = 1;
        for(int i=2;i<=5000010;i++){
            if(!phi[i]){
                
                for(int j=i;j<=5000010;j+=i){
                    if(!phi[j]) phi[j] = j;
                    phi[j] = phi[j]/i*(i-1);
                }
                
            }
        } 
        for(int i=2;i<5000010;i++) phi[i] = phi[i]*phi[i]+phi[i-1];
        return ;
    }
    
    int main(){
        getPhi();
        int T,a,b;
        scanf("%d",&T);
        for(int t=1;t<=T;t++){
            scanf("%d%d",&a,&b);
            printf("Case %d: %llu
    ",t,phi[b]-phi[a-1]);
        }
        
        
        return 0;
    } 
  • 相关阅读:
    puttytray
    让程序同时输出到文件与屏幕(tee)
    R将文件转化为矩阵
    gnome3下gedit乱码的解决方案
    perl随机打乱数组
    gnome 3.6
    google earth 离线下载地址
    wget 使用技巧
    运行pindel注意事项
    获取当前行号与列号
  • 原文地址:https://www.cnblogs.com/yuanshixingdan/p/5535453.html
Copyright © 2020-2023  润新知