nyoj 333-mdd的烦恼

本文介绍了一种使用筛法计算欧拉函数 φ(n) 的方法,适用于处理大量数据。通过理解欧拉函数与互质因数的关系,我们可以更高效地计算任意整数 n 的 φ 值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://acm.nyist.net/JudgeOnline/problem.php?pid=333

mdd的烦恼

时间限制: 1000 ms  |  内存限制: 65535 KB
难度: 3
描述
今天mdd看到这么一段话:在数论,对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目。此函数以其首名研究者欧拉命名,它又称为Euler's totient function、φ函数、欧拉商数等。 例如φ(8)=4,因为1,3,5,7均和8互质。于是他想用计算机实现欧拉函数的功能,但是他又不想去写,你能帮帮他吗?
ps: 互质(relatively primeì)又叫互素。若N个整数的最大公因数是1,则称这N个整数互质
输入
有多组测试数据组数小于1003,
每组测试数据有一个整数n(0<n<=65535^2+1).
输出
输出欧拉函数φ(n)的值。
样例输入
2
6
46
样例输出
1
2
22
利用欧拉函数和它本身不同质因数的关系,用 筛法计算出某个范围内所有数的欧拉函数值。
欧拉函数和它本身不同质因数的关系:欧拉函数ψ(N)=N{∏p|N}(1-1/p)亦即:ψ(N)=
(P是数N的 质因数
如:
ψ(10)=10×(1-1/2)×(1-1/5)=4;
ψ(30)=30×(1-1/2)×(1-1/3)×(1-1/5)=8;
ψ(49)=49×(1-1/7)=
=42。
#include<iostream>
using namespace std;
int oula(int n) {
  int ret = 1, i;
  for (int i = 2; i * i <= n; i++) {
    if (n % i == 0) {  //剔除所有因子
      n /= i;
      ret *= i - 1;
      while (n % i == 0) {
        n /= i;
        ret *= i;//为了保持公式的n*(1-1/p)..中的n
      } 
    } 
  }
  if (n > 1) //本身是质数的情况
    ret *= n - 1;
  return ret;
}
int main() {
  int n;
  while (cin >> n) {
    cout << oula(n) << endl;
  }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值