bzoj 2190 [SDOI2008]仪仗队
2015-12-24 22:44
357 查看
题目
2190: [SDOI2008]仪仗队
Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 1939 Solved: 1237
[Submit][Status][Discuss]
Description
作为体育委员,C君负责这次运动会仪仗队的训练。仪仗队是由学生组成的N * N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪仗队的左后方,根据其视线所及的学生人数来判断队伍是否整齐(如下图)。现在,C君希望你告诉他队伍整齐时能看到的学生人数。
Input
共一个数N。Output
共一个数,即C君应看到的学生人数。Sample Input
4Sample Output
9HINT
【数据规模和约定】 对于 100% 的数据,1 ≤ N ≤ 40000Source
数论[Submit][Status][Discuss]
一道经典的数论题
首先很容易想到只考虑一半的点
然后可以用类似于Eratosthenes筛素数法找到可以看见的点,又会轻易地发现当点(x,y)满足gcd(x,y)=1,时符合条件
所以就可以使用欧拉函数啦
直接套用公式
φ(n)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…..(1-1/pk),其中p1,
p2……pk为n的所有质因数,n是不为0的整数。
然后在一开始打印小于n的素数表,从小于n的素数中找出n的约数,套公式,OK!
下面附上代码:
#include<cstdio> #include<cmath> #include<cstring> using namespace std; int zhi[40001]; long long s=0; double ans; int n; int main() { scanf("%d",&n); memset(zhi,1,sizeof(zhi)); int k=0; for(int i=2;i<=n;i++) if(zhi[i]) <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span> zhi[++k]=i; <span style="white-space:pre"> </span> for(int j=1;j<=n/i;j++) <span style="white-space:pre"> </span> zhi[j*i]=0; } for(int i=2;i<=n-1;i++) { int a=i,ans=i; for(int j=1;j<=k;j++) { <span style="white-space:pre"> </span> if(zhi[j]>a)break; if(a%zhi[j]==0){ans=ans*(zhi[j]-1)/zhi[j];a=a/zhi[j];} <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>s+=ans; } if(n<=1)printf("0");else printf("%lld",2*s+3); return 0; }
然而我的代码虽然AC,但是却十分耗时,希望大家能给我好的建议
还有一道类似的题来自UVA 10214 如果你们想要更熟练地掌握可以做一做
http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=22935
相关文章推荐
- 新注册
- 四大漏洞入侵博客
- 在Ubuntu系统上安装Ghost博客平台的教程
- PHP多用户博客系统分析[想做多用户博客的朋友,需要了解]第1/3页
- 基于CakePHP实现的简单博客系统实例
- 基于jsp+servlet实现的简单博客系统实例(附源码)
- csdn 博客的css样式 v3
- 如何使用Gitblog和Markdown建自己的博客
- Flask入门教程实例:搭建一个静态博客
- 让写博客成为一种习惯
- 使用微信快捷登录Wordpress博客
- 博客之前在网易安家,现在迁移到了自己开发的blog http://blog.tongbor.com
- OpenAPI 之 开源软件信息预览 ProjectTips
- 自己对博客的计划
- 做一份30字的简历
- 从主流到边缘,博客为什么不行了?
- 里程碑:博客文章阅读数突破1000万
- 博客恢复访问通知!
- 博客更新主题通知!