洛谷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.

 

posted @ 2017-02-28 23:23  Klaier  阅读(658)  评论(0编辑  收藏  举报