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有相同的质因子公约数,可以用这些质因子的整数倍去标记与n不互素的数。然后在线性时间内的求第k个与n互素的数。

#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 n,k,kk;
int flag[maxn];

//求Eular(n),同时求出n的质因子,用这些质因子标记与n不互素的数。
int Eular(int n)
{
	int ret = n,m = n;

	memset(flag,0,sizeof(flag));
	for(int i = 2; i*i <= n; i++)
	{
		if(n%i == 0)
		{
			for(int j = 1; j*i <= m; j++)
				flag[j*i] = 1;

			ret -= ret/i;
			while(n%i == 0)
				n /= i;
		}
	}
	if(n > 1)
	{
		for(int j = 1; j*n <= m; j++)
			flag[j*n] = 1;
		ret -= ret/n;
	}

	return ret;
}

int main()
{
	while(~scanf("%d %d",&n,&k))
	{
		int cnt = Eular(n),t;

		t = k/cnt;
		if(k%cnt == 0)
			t--;
		kk = k - t*cnt;

		int cou = 0,i;
		for(i = 1; i <= n; i++)
		{
			if(flag[i] == 0)
				cou++;
			if(cou == kk)
				break;
		}
		printf("%d\n",i+t*n);
	}
	return 0;
}

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

时间: 2024-11-22 19:40:53

poj 2773 Happy 2006(欧拉函数应用)的相关文章

POJ 2478 Farey Sequence( 欧拉函数 + 法雷数列 )

POJ 2478 Farey Sequence ( 欧拉函数 + 法雷数列 ) #include <cstdio> #include <cstring> using namespace std; #define MAXN 1000005 typedef long long LL; int vis[ MAXN ], prime[ MAXN ], cnt, n; LL phi[ MAXN ]; void get_phi_prime( int N ) { phi[1] = 1; cnt

POJ 2154 Color (ploya欧拉函数)

ploya定理,然后公式利用欧拉函数优化,gcd必然是因子,这样只要枚举因子,每个因子利用欧拉函数计算出现次数 代码: #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int t, n, p; int pow_mod(int x, int k) { x %= p; int ans = 1; while (k) { if (k&1) ans = ans *

POJ 2407 Relatives(欧拉函数入门题)

Relatives 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 t

POJ 2773-Happy 2006(欧拉函数)

Happy 2006 Time Limit:3000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 2773 Appoint description:  System Crawler  (2015-04-06) Description Two positive integers are said to be relatively prime to each other

POJ 1284 Primitive Roots 欧拉函数模板题

#include <algorithm> #include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #include <queue> #include <cmath> #include <stack> #include <map> #include <ctime> #include <io

POJ 2407 Relatives(欧拉函数)

Relatives Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11801   Accepted: 5780 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 ther

poj 2773 利用欧拉函数求互质数

题意:找到与n互质的第 k个数 开始一看n是1e6 敲了个暴力结果tle了,后来发现k达到了 1e8 所以需要用到欧拉函数. 我们设小于n的 ,与n互质的数为  (a1,a2,a3.......a(phi(n))) 那么显然,在区间  [ k*n , (k+1)*n ]内的互质数即为 k*n+(a1,a2,a3.......a(phi(n))) 所以只需要求出 (a1,a2,a3.......a(phi(n))) 就可以利用欧拉函数快速找到后面的数 代码如下: #include <iostrea

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 3090 : Visible Lattice Points

Visible Lattice Points Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5636   Accepted: 3317 Description A lattice point (x, y) in the first quadrant (x and y are integers greater than or equal to 0), other than the origin, is visible fr