UVa 10179 - Irreducable Basic Fractions

题目:计算一个给定数的欧拉函数(1~n-1中和n互质的数的个数)。

分析:数论,素数筛法,欧拉函数。

欧拉函数:φ(n)= n *(1 - 1/p1)*(1 - 1/p2)*(1 - 1/p3)*…*(1 - 1/pt);

这里利用筛法打表计算出50000内的素数,因为数据范围是1000000000内的,

所以,不能被前50000内的素数整除的数,也一定是素数,并且每个数n中最多有一个;

计算输出即可。

说明:终于450题了(⊙_⊙)。

#include <iostream>
#include <cstdlib>

using namespace std;

int fac[30];
int prim[50000];
int used[50000];

int main()
{
	for (int i = 0 ; i < 50000 ; ++ i)
		used[i] = 0;
	int save = 0;
	for (int i = 2 ; i < 50000 ; ++ i)
		if (!used[i]) {
			prim[save ++] = i;
			for (int j = 2*i ; j < 50000 ; j += i)
				used[j] = 1;
		}

	int n;
	while (cin >> n && n) {
		int count = 0,base = 0,m = n;
		while (n > 1 && base < save) {
			if (n%prim[base] == 0) {
				fac[count ++] = prim[base];
				while (n%prim[base] == 0)
					n /= prim[base];
			}
			base ++;
		}
		if (n > 1) fac[count ++] = n;

		long long ans = m;
		for (int i = 0 ; i < count ; ++ i)
			ans = ans/fac[i]*(fac[i]-1);

		cout << ans << endl;
	}
	return 0;
}
时间: 2024-12-12 15:26:56

UVa 10179 - Irreducable Basic Fractions的相关文章

优质题表(机密版)

转载请注明出处:http://www.cnblogs.com/dashuzhilin/p/4556803.html 思维题: poj 1528 poj 1597 poj 2538 poj 2608 poj 2612 poj 2361 poj 2339 poj 2664 uva 10894 uva 10921   uva 10922   uva 10929 uva 10931   uva 10800   uva 10878 uva 10976   uva 10323   uva 201 poj 2

暴力枚举 UVA 10976 Fractions Again?!

题目传送门 1 /* 2 x>=y, 1/x <= 1/y, 因此1/k - 1/y <= 1/y, 即y <= 2*k 3 */ 4 #include <cstdio> 5 #include <iostream> 6 #include <algorithm> 7 #include <cmath> 8 #include <cstring> 9 #include <string> 10 #include <

uva 10976 Fractions Again(简单枚举)

10976 Fractions Again It is easy to see that for every fraction in the form 1 k (k > 0), we can always find two positive integers x and y, x ≥ y, such that: 1 k = 1 x + 1 y Now our question is: can you write a program that counts how many such pairs

uva 10976 fractions again(水题)——yhx

1 #include<cstdio> 2 int a[30010],b[30010]; 3 int main() 4 { 5 int i,j,k,l,m,n,x,y,z; 6 while (scanf("%d",&k)==1) 7 { 8 n=0; 9 for (i=k+1;i<=2*k;i++) 10 if ((k*i)%(i-k)==0) 11 { 12 a[++n]=k*i/(i-k); 13 b[n]=i; 14 } 15 printf("%

Fractions Again?! UVA - 10976

It is easy to see that for every fraction in the form 1k(k > 0), we can always find two positive integersx and y, x ≥ y, such that:1k=1x+1yNow our question is: can you write a program that counts how many such pairs of x and y thereare for any given

Uva 10976 Fractions Again?!

直接暴力 没技巧 y应该从k+1开始循环,因为不然y-k<0的时候 你相当于(x*y) % (负数) 了. 1 #include <iostream> 2 using namespace std; 3 int X[10005]; 4 int Y[10005]; 5 int main() 6 { 7 int k,cnt; 8 while(cin>>k) 9 { 10 cnt=0; 11 for(int y=k+1;y<=2*k;y++) 12 { 13 if( ( (k*

UVA 10976 Fractions Again?(枚举+数学)

题目大意: 就是说输入一个k,然后求出满足1/k = 1/x+1/y的所有形式,使得x>=y. 解题思路: 拿到这个题后,看到题目仅仅给了x>=y.这个条件,感觉无从下手,但是仔细想想就不难发现,只要我们 首先确定了枚举的范围,那么我们就能够在这个区间内,找到符合我们要求的解了. 推导: 因为x>=y,所以1/x<=1/y,由1/k-1/x=1/y -> 1/k-1/y <= 1/y -> y<=2k, 然后,由等式1/k = 1/x+1/y -> x

UVa 880 - Cantor Fractions

题目:按照三角形的形状摆放正整数(从1开始),递归的不断在原来的三角形的斜边上添加一条新边: 现在个你一个数字在这个构造中的序号,输出它的行列值. 分析:数学.第k个三角形包含前k(k+1)/ 2个元素,每次从左上角向下移动,横纵坐标之和为k+1: 计算出比n小的满足k(k+1)/ 2的k值,然后利用n - k(k+1)/ 2计算出位置即可. 说明:要使用long long,否则会溢出. #include <algorithm> #include <iostream> #inclu

UVA 10976 Fractions Again?! 简单枚举题

#include<stdio.h> struct pairs{ int x,y; }; struct pairs pairs[10000]; int judge(int k,int i){ if((k*i)%(i-k)==0) return 1; else return 0; } int main(){ int k,count; while(scanf("%d",&k)!=EOF){ count=0; for(int i=k+1;i<=2*k;i++){ if