博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu 数论+ 欧拉函数 1787
阅读量:6910 次
发布时间:2019-06-27

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

题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=1787

GCD Again

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 2239    Accepted Submission(s): 897

Problem Description
Do you have spent some time to think and try to solve those unsolved problem after one ACM contest?
No? Oh, you must do this when you want to become a "Big Cattle".
Now you will find that this problem is so familiar:
The greatest common divisor GCD (a, b) of two positive integers a and b, sometimes written (a, b), is the largest divisor common to a and b. For example, (1, 2) =1, (12, 18) =6. (a, b) can be easily found by the Euclidean algorithm. Now I am considering a little more difficult problem: 
Given an integer N, please count the number of the integers M (0<M<N) which satisfies (N,M)>1.
This is a simple version of problem “GCD” which you have done in a contest recently,so I name this problem “GCD Again”.If you cannot solve it still,please take a good think about your method of study.
Good Luck!
 

 

Input
Input contains multiple test cases. Each test case contains an integers N (1<N<100000000). A test case containing 0 terminates the input and this test case is not to be processed.
 

 

Output
For each integers N you should output the number of integers M in one line, and with one line of output for each line in input. 
 

 

Sample Input
2 4 0
 

 

Sample Output
0 1
 

 分析:

1:欧拉函数euler(n)  定义为 小于 n 又和 n 互素的正整数的个数。

n= p1^r1 * p2 ^r2 * …… * pk^rk

erler(n)  = n (1- 1/p1) * (1 - 1/p2) * ……*(1- 1/pk)

            = p1^(r1-1)  * p2^(r2 -1)  *   ……* pk^(rk -1) *  (p1 -1) *(p2-1) ……*(pk - 1)

2:则与n 不互素的个数为 n-1- erler(n)

代码如下:

#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;// 欧拉函数int euler(int n){ int ans=1; int i; for(i=2;i*i <=n;i++) { if(n%i ==0) { ans*=i-1; n/=i; while(n%i ==0) { ans*=i; n/=i; } } } if(n!=1) // 最后一个因子为n!=1,保存 ans*=n-1; return ans;}int main(){ int n; while(scanf("%d",&n)&& n) { printf("%d\n", n-1 - euler(n)); } return 0;}

 

转载于:https://www.cnblogs.com/zn505119020/p/3594336.html

你可能感兴趣的文章
CNN
查看>>
线程池的实现原理
查看>>
BZOJ 3625 [Codeforces Round #250]小朋友和二叉树 ——NTT 多项式求逆 多项式开根
查看>>
中兴 ZTE H618B 路由器刷机 tomato Dualwan 后pppoe 的问题
查看>>
NSURLSession学习笔记(一)简介
查看>>
spring MVC
查看>>
shell中的参数扩展, 特殊变量
查看>>
该死的研华PCL-730数字IO板卡
查看>>
Mysql触发器学习
查看>>
633. 寻找重复的数
查看>>
关于iOS 本地推送的知识二三点
查看>>
SQL查询学习
查看>>
前端变量命名之规则
查看>>
iOS开发-图片高斯模糊效果
查看>>
iOS开发-NSURLSession详解
查看>>
Linux Shell 数字计算与比较
查看>>
基于Https协议返回Jason字符串
查看>>
把数组排成最小的数
查看>>
canvas绘制经典星空连线效果
查看>>
Java I/O Reader and Writer
查看>>