博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Farey Sequence POJ - 2478 (欧拉函数 前缀和)
阅读量:4557 次
发布时间:2019-06-08

本文共 1249 字,大约阅读时间需要 4 分钟。

Farey Sequence POJ - 2478

题目链接:

题目:

法理序列Fn是指对于任意整数n( n >= 2),由不可约的分数a/b(0 < a < b <= n),gcd(a,b) = 1升序排列构成的序列,最开始的几个如下
F2 = {1/2}
F3 = {1/3, 1/2, 2/3}
F4 = {1/4, 1/3, 1/2, 2/3, 3/4}
F5 = {1/5, 1/4, 1/3, 2/5, 1/2, 3/5, 2/3, 3/4, 4/5}
你的任务是计算法理序列Fn中的元素个数。
Input
输入包含多组样例. 每组样例仅一行, 有一个正整数n (2 <= n <= 10
6). 两组样例间无空行. 0代表输入结束.
Output
对于每种情况,你需要输出法理序列Fn中包含元素的个数
Sample Input
23450
Sample Output
1359 思路: 1=1 3=1+2 5=1+2+2 9=1+2+2+4 ... 由于1 2 2 4 4 ... 是欧拉值,故很容易想到是求欧拉值的前缀和,所以第一步将欧拉值打表出来,后来我一开始遍历用for循环求 和,超时了,所以这里还是要将前缀和存入表内,由于是从下标为2开始的,故求前缀和从下标为3开始
//// Created by hanyu on 2019/8/9.//#include 
#include
#include
#include
#include
#include
#include
#include
using namespace std;typedef long long ll;const int maxn=2e6+7;ll euler[maxn];void value(){ memset(euler,0,sizeof(euler)); euler[1]=1; for(int i=2;i<=maxn;i++) { if(!euler[i]) { for(int j=i;j<=maxn;j+=i) { if(!euler[j]) euler[j]=j; euler[j]=euler[j]/i*(i-1); } } } for(int i=3;i<=maxn;i++) euler[i]+=euler[i-1];}int main(){ int n; value(); while(~scanf("%d",&n)&&n) { printf("%lld\n",euler[n]); } return 0;}

 

 

 

转载于:https://www.cnblogs.com/Vampire6/p/11329981.html

你可能感兴趣的文章
关于setTimeout运行机制
查看>>
2019 Multi-University Training Contest 4
查看>>
学号 《信息安全系统设计基础》第7周学习总结(一)
查看>>
POJ1741Tree [点分治]【学习笔记】
查看>>
BZOJ 3238: [Ahoi2013]差异 [后缀自动机]
查看>>
UVA 12633 Super Rooks on Chessboard [fft 生成函数]
查看>>
memcache 启动 failed to start
查看>>
欧拉函数与欧拉定理
查看>>
fzyzojP2984 -- 序列变换问题
查看>>
poj 2888 Magic Bracelet
查看>>
mysql排序让空值NULL排在数字后边
查看>>
Mono for Android 实现高效的导航
查看>>
30多条mysql数据库优化方法,千万级数据库记录查询轻松解决
查看>>
动画制作 手机APP制作以及响应式的实现
查看>>
我的第一篇博文(Winfrom下WebBrowser控件的使用)
查看>>
git使用笔记(六)github
查看>>
30+ 强大的Buddypress主题–开始您的社区站点吧
查看>>
cinder侧卸载卷流程分析
查看>>
codeforcesD_状压dp
查看>>
windows下通过pid 找到运行程序的路径
查看>>