Jzoj3927 可见点数
2017-10-04 11:19
99 查看
ZPS经过长期的努力争取,终于成为了0901班的领操员,他要带领0901班参加广播操比赛。现在0901班的队伍可以看作是一个n*n的点阵,每个人都站在格点上。现在作为领操员的ZPS站(0,0)点,他想知道如果0901班的队伍站齐了,他能看到多少个人的脸(假设每个人的身高相同,体积相同)
这个题很容易发现,若一个点(x,y)可以被看到,那么gcd(x,y)=1,否则一定会被(x/gcd,y/gcd)挡住
这样的话,我们问题变成了求点对(x,y)使得gcd(x,y)=1,按道理来说应该要用莫比乌斯反演,但是这道题是方阵而不是矩阵所以答案就是2(Σφ(i) (1<=i<=n))+1
至于如何求φ,可以用线性筛法,和素数筛法一样
这个题很容易发现,若一个点(x,y)可以被看到,那么gcd(x,y)=1,否则一定会被(x/gcd,y/gcd)挡住
这样的话,我们问题变成了求点对(x,y)使得gcd(x,y)=1,按道理来说应该要用莫比乌斯反演,但是这道题是方阵而不是矩阵所以答案就是2(Σφ(i) (1<=i<=n))+1
至于如何求φ,可以用线性筛法,和素数筛法一样
#include<stdio.h> bool vis[1000010]; int w[1000010],t=0,n,phi[1000010]; void Gphi(){ phi[1]=1; for(int i=2;i<=n;++i){ if(!vis[i]) w[t++]=i,phi[i]=i-1; for(int j=0;j<t&&i*w[j]<=n;++j){ vis[i*w[j]]=1; if(i%w[j]==0){ phi[i*w[j]]=phi[i]*w[j]; break; } else phi[i*w[j]]=phi[i]*(w[j]-1); } } } int main(){ scanf("%d",&n);n--; Gphi(); if(n==0){ return puts("0")&0; } long long ans=0; for(int i=1;i<=n;++i) ans+=phi[i]; printf("%lld\n",ans*2+1); }
相关文章推荐
- jzoj3927【NOIP2014模拟11.6】可见点数(欧拉函数)
- JZOJ 3927. 【NOIP2014模拟11.6】可见点数
- jzoj 3927_可见点数_数论
- JZOJ 7.10B组第一题 可见点数
- 3927. 【NOIP2014模拟11.6】可见点数 (Standard IO)
- jozj. 3927. 【NOIP2014模拟11.6】可见点数 洛谷 P2158 [SDOI2008]仪仗队
- 3D分析之可见性分析工具
- JZOJ5381. 【NOIP2017提高A组模拟9.21】传送蛋糕
- 使用Menu per Role控制Drupal菜单链接的可见性
- JZOJ5385. 【NOIP2017提高A组模拟9.23】Carry
- C# MsChart 类似十字光标/交叉线 跟随鼠标移动功能 的优化 [问题点数:88分]
- 【jzoj5389】【NOIP2017提高A组模拟9.26】【解梦】
- HDU 3829 最大du立集=2个点集点数-最大匹配数
- BZOJ1007水平可见直线 (凸包)
- HTML5中5个简单实用的API(第二篇,含全屏、可见性、拍照、预加载、电池状态)
- Jzoj3883 线段树
- MapGIS K9 三维TDE平台中实体的可见与不可见
- 【JZOJ 5393】【NOIP2017提高A组模拟10.5】Snake vs Block
- Oracle:列出当前用户下可见的所有表名及权限…
- [JZOJ5395]【NOIP2017提高A组模拟10.6】Count