jozj. 3927. 【NOIP2014模拟11.6】可见点数 洛谷 P2158 [SDOI2008]仪仗队

本文探讨了一个数学问题,即在广播操比赛中,位于(0,0)位置的领操员能看到多少名队员的脸。通过分析得出,只有当队员的位置坐标(x,y)满足最大公约数gcd(x,y)=1时,领操员才能看到该队员。文章给出了具体的计算方法,并提供了实现这一计算的代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Description

ZPS经过长期的努力争取,终于成为了0901班的领操员,他要带领0901班参加广播操比赛。现在0901班的队伍可以看作是一个n*n的点阵,每个人都站在格点上。现在作为领操员的ZPS站(0,0)点,他想知道如果0901班的队伍站齐了,他能看到多少个人的脸(假设每个人的身高相同,体积相同)。

Input

一个正整数n。

Output

ZPS能看到多少个人的脸(当然他是看不到自己的脸的)。

Sample Input

3

Sample Output

5

Data Constraint

40%的数据,n<=1500。
100%的数据,n<=100000。

分析:
某人在原点,所以他的视线可以看做一个正比例函数。显然,对于一个点(x,y),只有当gcd(x,y)=1时才能被看到,否则会被(x/k,y/k) {k=gcd(x,y)} 挡住。显然可以看到的点数等于就是确定i(i<=n)求gcd(i,x)=1 {x<=n}时,x的个数和。我们知道,对于一对(x,y)若被看到,则(y,x)也会被看到,显然关于y=x直对称。这时,我们只需求的解的范围变为
(x<=i),解的个数显然等于φ(i),那么答案就是sum(φ(1)—φ(n))*2+1。由于对称性要乘2,但是(1,1)被算了两遍,要减1,但是也要加上(0,1)和(1,0)这两个点,所以要加1。还有,当n=1是,答案是0哦。

代码:

var
 phi:array [1..100001] of longint;
 n,i,j:longint;
 ans:int64;
begin
 readln(n);
 if n=1 then
  begin  writeln(0); exit; end;
 n:=n-1;
 phi[1]:=1;
 for i:=2 to n do
  begin
   if phi[i]=0 then
    begin
     j:=i;
     while j<=n do
      begin
       if (phi[j]=0) then phi[j]:=j;
       phi[j]:=phi[j] div i*(i-1);
       j:=j+i;
      end;
    end;
  end;
 for i:=1 to n do
  ans:=ans+phi[i];
 ans:=ans*2+1;
 writeln(ans);
end.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值