BZoj 2190: [SDOI2008]仪仗队【欧拉函数】
来源:互联网 发布:电视机看电视软件 编辑:程序博客网 时间:2024/05/01 17:36
首先感觉题意不明确,对1*1 的情况没有说清楚,也许后台没有出这组数据(其实想说...肯定没有)
手动划上几组数据,不难找到规律
题解:
题目给出的方阵看成一个数表,记为A, 为了讨论方便,把行和列都从0 开始编号
途中有对称的部分,因此只讨论一半的情况:
A(i,j) 表示第 i 行,第 j 列的某个人,设体育委员位于A(0,0) ,
根据题意,如果体育委员和某个人的连线上有别的人,那么这个人是看不到的,
即为对于A(i,j),如果前 i 行中存在元素A(x,y) (i%x=j%y=0),那么A(i,j) 必定是看不到的!(画图很直观)
那么对于第 i 行,有多少个点找不到能被挡住的,即找不到满足条件的x 和y 呢,答案是第i行上列数与i 互质的所有的点!
比较直观的理解便是:对于如果 j 和 i 互质,那么在前 i-1 列中能被 i 整除的行中必定找不到列数 能整除 j 元素!
也就是说对第 i 来说,新增加的看的到的人数,便是和i 互质的数量,也就是i 的欧拉函数值相加了,
对于所有的行来说,那就是1-n 的欧拉函数值的累加和了,当然,别忘了上面只讨论了一半的情况,而且注意副对角线上有个点正好没统计上,要额外加上
因此对于n 阶的方阵答案即为:
2*(φ(1)+φ(2)+....+φ(n-1))+1 φ(i) 为 i 的欧拉函数值
另外注意输出用64位....
网上的很多题解不够详细,也许是他们感觉这题太水了,也可能是他们自己也没搞明白....
ps:以上推导可能非常不严谨,有错请大神指出,谢谢!
#include<stdio.h>typedef long long ll;ll euler(ll x){ ll ans=x; for(ll i=2;i*i<=x;++i) { if(x%i==0) { ans=ans-ans/i; while(x%i==0) { x/=i; } } } if(x>1) { ans=ans-ans/x; } return ans;}int main(){ ll n; while(~scanf("%lld",&n)) { ll ans=0; for(ll i=1;i<n;++i) { ans+=euler(i); } printf("%lld\n",ans*2+1); } return 0;}
0 0
- BZOJ-2190-仪仗队-SDOI2008-欧拉函数
- BZoj 2190: [SDOI2008]仪仗队【欧拉函数】
- bzoj 2190: [SDOI2008]仪仗队 欧拉函数
- 【bzoj 2190】[SDOI2008]仪仗队 欧拉函数
- [BZOJ 2190][SDOI2008]仪仗队:欧拉函数
- BZOJ 2190: [SDOI2008]仪仗队 欧拉函数
- BZOJ 2190 [SDOI2008]仪仗队 欧拉函数
- ♥BZOJ 2190: [SDOI2008]仪仗队【欧拉函数】
- [bzoj 2190] [SDOI2008]仪仗队:欧拉函数,线性筛
- BZOJ 2190 [SDOI2008]仪仗队——欧拉函数
- [SDOI2008]仪仗队 欧拉函数
- 【bzoj2190】【sdoi2008】【仪仗队】【欧拉函数】
- Bzoj2190:[SDOI2008]仪仗队:欧拉函数
- [BZOJ2190] [SDOI2008] 仪仗队 - 欧拉函数
- bzoj2190: [SDOI2008]仪仗队(欧拉函数)
- BZOJ 2190 [SDOI2008]仪仗队
- bzoj 2190: [SDOI2008]仪仗队
- BZOJ 2190: [SDOI2008]仪仗队
- Activity向Fragment传值
- 连续子数组的最大和
- 集合框架和泛型
- uCOS-II中Event阻塞、唤醒、超时机制(以Sem为例)
- FCM(Fuzzy C-Means)模糊C聚类
- BZoj 2190: [SDOI2008]仪仗队【欧拉函数】
- [Android]基于Android的Java学习路线图
- 如何在Linux上搭建VisualSVN Server(svn服务端)
- 机房重构—策略模式简单用
- 《活着就为改变世界:史蒂夫.乔布斯转》读书分享
- go语言的string和slice是值拷贝吗?
- 手把手粗糙解析KMP算法
- 关于oracle数据库安装出现 7003/7009
- UVA 11082 (最大流)