poj 3090 && poj 2478(法雷级数,欧拉函数)

http://poj.org/problem?id=3090

法雷级数

法雷级数的递推公式很简单:f[1] = 2; f[i] = f[i-1]+phi[i]。

该题是法雷级数的变形吧,答案是2*f[i]-1。

#include <stdio.h>
#include <iostream>
#include <map>
#include <set>
#include <stack>
#include <vector>
#include <math.h>
#include <string.h>
#include <queue>
#include <string>
#include <stdlib.h>
#include <algorithm>
#define LL long long
#define _LL __int64
#define eps 1e-12
#define PI acos(-1.0)
using namespace std;

const int maxn = 1100;

int flag[maxn];
int prime[maxn];
int phi[maxn];
LL f[maxn];

void init()
{
	memset(flag,0,sizeof(flag));
	prime[0] = 0;
	phi[1] = 1;
	for(int i = 2; i < maxn; i++)
	{
		if(flag[i] == 0)
		{
			phi[i] = i-1;
			prime[++prime[0]] = i;
		}
		for(int j = 1; j <= prime[0]&&prime[j]*i<maxn; j++)
		{
			flag[prime[j]*i] = 1;
			if(i % prime[j] == 0)
				phi[prime[j]*i] = phi[i] * prime[j];
			else
				phi[prime[j]*i] = phi[i] * (prime[j] - 1);
		}
	}
	f[1] = 2;
	for(int i = 2; i <= 1000; i++)
		f[i] = f[i-1] + phi[i];
}

int main()
{
	init();
	int test;
	scanf("%d",&test);
	for(int item = 1; item <= test; item++)
	{
		int x;
		scanf("%d",&x);
		printf("%d %d %lld\n",item,x,f[x]*2-1);
	}
	return 0;
}

http://poj.org/problem?id=2478

更简单了,直接求法雷级数。基于素数筛的欧拉函数。

#include <stdio.h>
#include <iostream>
#include <map>
#include <set>
#include <stack>
#include <vector>
#include <math.h>
#include <string.h>
#include <queue>
#include <string>
#include <stdlib.h>
#include <algorithm>
#define LL long long
#define _LL __int64
#define eps 1e-12
#define PI acos(-1.0)
using namespace std;

const int maxn = 1000010;

int flag[maxn];
int prime[maxn];
int phi[maxn];
LL f[maxn];

void init()
{
	memset(flag,0,sizeof(flag));
	prime[0] = 0;
	phi[1] = 1;
	for(int i = 2; i < maxn; i++)
	{
		if(flag[i] == 0)
		{
			phi[i] = i-1;
			prime[++prime[0]] = i;
		}
		for(int j = 1; j <= prime[0]&&prime[j]*i<maxn; j++)
		{
			flag[prime[j]*i] = 1;
			if(i % prime[j] == 0)
				phi[prime[j]*i] = phi[i] * prime[j];
			else
				phi[prime[j]*i] = phi[i] * (prime[j] - 1);
		}
	}
	f[1] = 2;
	for(int i = 2; i <= 1000010; i++)
		f[i] = f[i-1] + phi[i];
}

int main()
{
	init();
	int n;
	while(~scanf("%d",&n)&&n)
	{
		printf("%lld\n",f[n]-2);
	}

	return 0;
}

poj 3090 && poj 2478(法雷级数,欧拉函数),布布扣,bubuko.com

时间: 2024-12-16 07:19:42

poj 3090 && poj 2478(法雷级数,欧拉函数)的相关文章

POJ 3090 Visible Lattice Points 欧拉函数

链接:http://poj.org/problem?id=3090 题意:在坐标系中,从横纵坐标 0 ≤ x, y ≤ N中的点中选择点,并且这些点与(0,0)的连点不经过其他的点. 思路:显而易见,x与y只有互质的情况下才会发生(0,0)与(x,y)交点不经过其他的点的情况,对于x,y等于N时,可以选择的点均为小于等于N并且与N互质的数,共Euler(N)个,并且不重叠.所以可以得到递推公式aa[i]=aa[i]+2*Euler(N). 代码: #include <iostream> #in

poj 2480 Longge&#39;s problem [ 欧拉函数 ]

传送门 Longge's problem Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7327   Accepted: 2416 Description Longge is good at mathematics and he likes to think about hard mathematical problems which will be solved by some graceful algorithms.

poj 2773 Happy 2006(欧拉函数应用)

http://poj.org/problem?id=2773 题意:输入n,k,求与n不互素的第k个数,k可能大于n. 思路:以n=6为例,与6互素的数有一定规律.{1,5},{7,12},{13,18}......,发现在[1,n],[n+1,n*2]......[m*n+1,(m+1)*n]区间内素数个数相同,且对应位置的数都相差n的整数倍.因此只要求出[1,n]内的与n互素的数即可.这个过程没必要一个一个枚举,可以用欧拉函数解决.因为欧拉函数已经求出了n的所有质因子,与n不互素的数都与n有

poj 3696 The Luckiest number 欧拉函数在解a^x=1modm的应用

题意: 给一个L,求长度最小的全8数满足该数是L的倍数. 分析: 转化为求方程a^x==1modm.之后就是各种数学论证了. 代码: //poj 3696 //sep9 #include <iostream> #include <algorithm> using namespace std; typedef long long ll; ll L; ll factor[65536]; ll mul(ll x,ll y,ll p) { ll ret=0; while(y){ if(y&

poj 2407 Relatives(简单欧拉函数)

Description Given n, a positive integer, how many positive integers less than n are relatively prime to n? Two integers a and b are relatively prime if there are no integers x > 1, y > 0, z > 0 such that a = xy and b = xz. Input There are several

poj 2478 Farey Sequence(基于素数筛法求欧拉函数)

http://poj.org/problem?id=2478 求欧拉函数的模板. 初涉欧拉函数,先学一学它基本的性质. 1.欧拉函数是求小于n且和n互质(包括1)的正整数的个数.记为φ(n). 2.欧拉定理:若a与n互质,那么有a^φ(n) ≡ 1(mod n),经常用于求幂的模. 3.若p是一个质数,那么φ(p) = p-1,注意φ(1) = 1. 4.欧拉函数是积性函数: 若m与n互质,那么φ(nm) = φ(n) * φ(m). 若n = p^k且p为质数,那么φ(n) = p^k - p

POJ 2478 欧拉函数(欧拉筛法) HDU 1576 逆元求法

相关逆元求法,我之前有写过,还有欧拉函数的求法,欧拉函数与逆元的关系  点击 POJ 2478 又是一个打表的题目,一眼看出结果就是前n个欧拉函数值的和. 这里直接计算欧拉函数值求和会超时,看见多组数据. 然后就是计算欧拉函数,打表就好了. #include <stdio.h> #include <string.h> #include <iostream> using namespace std; typedef long long LL; const int N =

POJ 2478 Farey Sequence 筛选法求欧拉函数

题目来源:POJ 2478 Farey Sequence 题意:输入n 求 phi(2)+phi(3)+phi(4)+...+phi(n) 思路:用类似筛法的方式计算phi(1), phi(2), ..., phi(n) 再求前缀和 #include <cstdio> #include <cstring> #include <cmath> //欧拉phi函数 const int maxn = 1000010; typedef long long LL; int eule

欧拉函数 &amp; 【POJ】2478 Farey Sequence &amp; 【HDU】2824 The Euler function

http://poj.org/problem?id=2478 http://acm.hdu.edu.cn/showproblem.php?pid=2824 欧拉函数模板裸题,有两种方法求出所有的欧拉函数,一是筛法,而是白书上的筛法. 首先看欧拉函数的性质: 欧拉函数是求小于n且和n互质(包括1)的正整数的个数.记为φ(n). 欧拉定理:若a与n互质,那么有a^φ(n) ≡ 1(mod n),经常用于求乘法逆元. 若p是一个质数,那么φ(p) = p-1,注意φ(1) = 1. 欧拉函数是积性函数