• 洛谷P3601签到题(欧拉函数)


    题目背景

    这是一道签到题!

    建议做题之前仔细阅读数据范围!

    题目描述

    我们定义一个函数:qiandao(x)为小于等于x的数中与x不互质的数的个数。

    这题作为签到题,给出l和r,要求求

    输入输出格式

    输入格式:

    一行两个整数,l、r。

     

    输出格式:

    一行一个整数表示答案。

     

    输入输出样例

    输入样例#1:
    233 2333
    输出样例#1:
    1056499

    输入样例#2:
    2333333333 2333666666
    输出样例#2:
    153096296

    说明

    对于30%的数据,

    对于60%的数据,

    对于100%的数据,

    qiandao(x)=x-phi(x),转化为求欧拉函数,而x只可能有一个大于n^0.5的素因子,所以只要求到n^0.5的素数就行了。还是批量处理欧拉函数的值,否则TLE啊。

     1 program rrr(input,output);
     2 const
     3   cs=666623333;
     4 var
     5   a:array[0..1000010]of boolean;
     6   f,c:array[0..1000010]of int64;
     7   i,j,n:longint;
     8   l,r,k,ans:int64;
     9 begin
    10    assign(input,'r.in');assign(output,'r.out');reset(input);rewrite(output);
    11    readln(l,r);
    12    n:=trunc(sqrt(r));
    13    fillchar(a,sizeof(a),true);
    14    k:=l;while k<=r do begin f[k-l]:=k;c[k-l]:=k;inc(k); end;
    15    for i:=2 to n do
    16       if a[i] then
    17          begin
    18             k:=l div i*i;if k<l then k:=k+i;
    19             while k<=r do
    20                begin
    21                   f[k-l]:=f[k-l] div i*(i-1);
    22                   while c[k-l] mod i=0 do c[k-l]:=c[k-l] div i;
    23                   k:=k+i;
    24                end;
    25             j:=i<<1;while j<=n do begin a[j]:=false;j:=j+i; end;
    26          end;
    27    k:=l;while k<=r do begin if c[k-l]>1 then f[k-l]:=f[k-l] div c[k-l]*(c[k-l]-1);inc(k); end;
    28    ans:=0;
    29    k:=l;while k<=r do begin ans:=(ans+k-f[k-l]) mod cs;inc(k); end;
    30    write(ans);
    31    close(input);close(output);
    32 end.
  • 相关阅读:
    作业 20181204-1 每周例行报告
    对团队成员公开感谢
    附加作业 软件工程原则的应用实例分析
    作业 20181127-2 每周例行报告
    作业 20181120-1 每周例行报告
    作业 20181113-2 每周例行报告
    作业 20181030-4 每周例行报告
    作业 20181023-3 每周例行报告
    SDWebImage的实现原理与底层结构拆解
    计算文件或者文件夹的大小用于计算下载速度或者是显示清除缓存大小
  • 原文地址:https://www.cnblogs.com/Currier/p/6481616.html
Copyright © 2020-2023  润新知