[BZOJ2190][SDOI2008]仪仗队
2015-07-16 07:37
225 查看
2190: [SDOI2008]仪仗队
Time Limit: 10 Sec Memory Limit: 259 MBDescription
作为体育委员,C君负责这次运动会仪仗队的训练。仪仗队是由学生组成的N * N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪仗队的左后方,根据其视线所及的学生人数来判断队伍是否整齐(如下图)。现在,C君希望你告诉他队伍整齐时能看到的学生人数。
Input
共一个数N。Output
共一个数,即C君应看到的学生人数。Sample Input
4Sample Output
9HINT
[数据规模和约定] 对于 100% 的数据,1 ≤ N ≤ 40000Source
数论题解
点(x,y)如果gcd(x,y)=1才能被看到点(x,y)如果gcd(x,y)=1 才能被看到我们把c点看做(0,0),那么我们分离出一个(n−1)∗(n−1)的矩阵,这个矩阵上能看到的点是对称的,所以我们分离出他的上三角形部分,他的第i行(2<=i<=n−1)能被看到的点有φ(i)个我们把c点看做(0,0),那么我们分离出一个(n-1)*(n-1)的矩阵,这个矩阵上能看到的点是对称的,所以我们分离出他的上三角形部分,他的第i行(2<=i<=n-1)能被看到的点有\varphi(i)个
所以ans=∑i=2n−1φ(i)+3,另3个点分别是(1,1),(1,0),(0,1)所以ans=\sum_{i=2}^{n-1}\varphi(i)+3,{另3个点分别是(1,1),(1,0),(0,1)}
const maxn=40000; var check:array[0..maxn]of boolean; phi,prime:array[0..maxn]of longint; n,len,ans,i,j:longint; begin readln(n); len:=0; for i:=2 to n-1 do begin if check[i]=false then begin inc(len); prime[len]:=i; phi[i]:=i-1 end; for j:=1 to len do begin if i*prime[j]>n then break; check[i*prime[j]]:=true; if i mod prime[j]=0 then begin phi[i*prime[j]]:=phi[i]*prime[j]; break; end else phi[i*prime[j]]:=phi[i]*(prime[j]-1); end; end; ans:=0; for i:=2 to n-1 do inc(ans,phi[i]); ans:=ans*2+3; writeln(ans); end.
相关文章推荐
- SQL——连接
- 黑马程序员-C语言基础六:函数
- C#几种截取字符串的方法(split 、Substring、Replace、remove)
- C#几种截取字符串的方法(split 、Substring、Replace、remove)
- 黑马程序员-C语言基础五:流程控制
- 读改善c#代码157个建议:建议7~9
- 无线互联奖学金文章连载(一)——北京总部49期陈聪
- 黑马程序员-C语言基础四:基本运算
- A 数据类型
- root的方法大体上有以下三种
- 黑马程序员-C语言基础三:scanf函数
- 做微信营销小组的一些感想
- 【LeetCode-面试算法经典-Java实现】【002-Add Two Numbers (单链表表示的两个数相加)】
- Java中ListIterator和Iterator详解与辨析
- Android apktool 2.1 反编译教程
- ACM_暑期计划 —— 第一天
- JSTL标准函数总结
- Java学习篇-------对于main函数参数的理解
- JavaScript经典代码总结
- JavaScript日期对象使用总结