zoukankan      html  css  js  c++  java
  • 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;
    } 
  • 相关阅读:
    第六课 使用oflash软件烧写bin文件至开发板
    Linux查看、添加、修改PATH环境变量
    第七课 Linux裸机开发+SourceInsight3.5使用+notepad++使用
    第五课 Linux高级命令
    数组的方法总结
    浅谈 return false 和preventDefault stopPropagation stopImmediatePropagation 的正确用法
    实时统计输入的文字
    滚轮滚动事件
    window.onload和DOMReady
    JS获取浏览器可视区域的尺寸
  • 原文地址:https://www.cnblogs.com/yuanshixingdan/p/5535453.html
Copyright © 2011-2022 走看看