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