题意就是求10^9以内的正整数的欧拉函数(Φ(n)表示<=n的与n互质的正整数个数)。

解法:用欧拉筛和欧拉函数的一些性质:
    1.若p是质数,Φ(p)=p-1;
    2.欧拉函数是积性函数,即若a,b互质,则Φ(ab)=Φ(a)*Φ(b);
    3.若a,b不互质,则Φ(ab)=Φ(a)*b。

若 n≤10^6,可以通过欧拉筛用数组预处理得出;若不是,再分解质因数,利用Φ(n)=n*(1-1/p1)*(1-1/p2)*...*(1-1/pk) {除去各质因数的 n 以内的倍数}求出。

P.S. n 不是10^6以内分解质因数并求解时要注意啊,我WA了7次! %>_<%

P.P.S. 这题数据弱,不用欧拉筛更快......不写mn_prim,而用标记数组也是可以的。

 1 #include<cstdio>
2 #include<cstdlib>
3 #include<cstring>
4 #include<cmath>
5 #include<iostream>
6 using namespace std;
7 #define N (int)1e9
8 #define M (int)1e6
9 typedef long long LL;
10
11 int phi[M+10],prim[M+10],mn_prim[M+10];
12 int pr=0;
13
14 void get_prime()
15 {
16 memset(mn_prim,0,sizeof(mn_prim));
17 for (int i=2;i<=M;i++)
18 {
19 if (!mn_prim[i])
20 {
21 prim[++pr]=i;
22 phi[i]=i-1;
23 }
24 for (int j=1;j<=pr,i*prim[j]<=M;j++)
25 {
26 mn_prim[i*prim[j]]=prim[j];
27 if (i%prim[j]!=0)
28 phi[i*prim[j]]=phi[i]*phi[prim[j]];
29 else
30 {
31 phi[i*prim[j]]=phi[i]*prim[j];
32 break;
33 }
34 }
35 }
36 }
37 int main()
38 {
39 get_prime();
40 int n;
41 while (1)
42 {
43 scanf("%d",&n);
44 if (!n) break;
45 if (n<=M-10) printf("%d\n",phi[n]);
46 else
47 {
48 int cnt=n,t=n;
49 for (int i=2;i<=t;i++)//t
50 {
51 if (t%i==0)
52 {
53 cnt-=cnt/i;// cnt*(1-1/i);
54 while (t%i==0) t/=i;
55 }
56 if (t==1) break;
57 }
58 printf("%d\n",cnt);
59 }
60 }
61 return 0;
62 }

【poj 2407】Relatives(数论--欧拉函数 模版题)的更多相关文章

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

    Relatives Given n, a positive integer, how many positive integers less than n are relatively prime t ...

  2. POJ 2407 Relatives(欧拉函数)

    http://poj.org/problem?id=2407 题意: 给出一个n,求小于等于的n的数中与n互质的数有几个. 思路: 欧拉函数的作用就是用来求这个的. #include<iostr ...

  3. POJ 2407 Relatives 【欧拉函数】

    裸欧拉函数. #include<stdio.h> #include<string.h> ; int p[N],pr[N],cnt; void init(){ ;i<N;i ...

  4. POJ 2407 Relatives (欧拉函数)

    题目链接 Description Given n, a positive integer, how many positive integers less than n are relatively ...

  5. POJ 2407 Relatives【欧拉函数】

    <题目链接> 题目大意: Given n, a positive integer, how many positive integers less than n are relativel ...

  6. hdu 1286 找新朋友 欧拉函数模版题

    找新朋友 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Problem Des ...

  7. 数论 - 欧拉函数模板题 --- poj 2407 : Relatives

    Relatives Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11372   Accepted: 5544 Descri ...

  8. hdu1286(找新朋友)&&POJ2407Relatives(欧拉函数模版题)

    http://acm.hdu.edu.cn/showproblem.php?pid=1286 没什么好说的,模板题,主要是弄懂欧拉函数的思想. #include <iostream> #i ...

  9. POJ_2407 Relatives 【欧拉函数裸题】

    一.题目 Given n, a positive integer, how many positive integers less than n are relatively prime to n? ...

随机推荐

  1. P4292 [WC2010]重建计划 点分治+单调队列

    题目描述 题目传送门 分析 看到比值的形式就想到 \(01分数规划\),二分答案 设当前的值为 \(mids\) 如果存在\(\frac{\sum _{e \in S} v(e)}{|S|} \geq ...

  2. HBase的架构设计为什么这么厉害!

    老刘是一名即将找工作的研二学生,写博客一方面是复习总结大数据开发的知识点,一方面是希望能够帮助和自己一样自学编程的伙伴.由于老刘是自学大数据开发,博客中肯定会存在一些不足,还希望大家能够批评指正,让我 ...

  3. 温故而知新--day2

    温故而知新--day2 类 类与对象 类是一个抽象的概念,是指对现实生活中一类具有共同特征的事物的抽象.其实列化后称为对象.类里面由类属性组成,类属性可以分为数据属性和函数属性(函数属性又称为类方法) ...

  4. linux网络工具nc命令

    nc是netcat的简写,有着网络界的瑞士军刀美誉.因为它短小精悍.功能实用,被设计为一个简单.可靠的网络工具. nc命令的作用 (1)实现任意TCP/UDP端口的侦听,nc可以作为server以TC ...

  5. LeetCode530. 二叉搜索树的最小绝对差

    题目 又是常见的BST,要利用BST的性质,即中序遍历是有序递增序列. 法一.中序遍历 1 class Solution { 2 public: 3 vector<int>res; 4 v ...

  6. C语言逗号运算符(C语言学习笔记)

    什么是逗号运算符 逗号运算符 逗号运算符是指在C语言中,多个表达式可以用逗号分开,其中用逗号分开的表达式的值分别结算,但整个表达式的值是最后一个表达式的值. 用法 多个变量赋值 原因:"=& ...

  7. mysql—make_set函数

    使用格式:MAKE_SET(bits,str1,str2,-) 1 返回一个设定值(含子字符串分隔字符串","字符),在设置位的相应位的字符串.str1对应于位0,str2到第1位 ...

  8. D2Admin 登录用户重新初始话右侧菜单

    背景 最近用到D2Admin开发项目,用户登录菜单要根据用户角色权限获取,但是又不想用官网的方案(vue基于d2-admin的RBAC权限管理解决方案),所以自己加了个只修改 menuAside的方案 ...

  9. SAP 修改数据元素 注意事项

    在修改数据元素的时候,通常要注意一下几点: 1.在修改完数据元素后,如果激活不成功,那么就要通过SE14进入数据库实用程序,在对象名处输入数据元素相关联的表的名称 下面词典对象选择表,然后点击编辑,处 ...

  10. 1V升3V芯片,1V升3.3V芯片,大电流的,低功耗

    一般来说,1V的电压实在很低了,即使是干电池的话,再1V时,也是基本属于没电状态了.还有一种是干电池输出电流大时,也会把干电池的电压从1.5V拉低到1V左右. 更多的是客户对于1V时要能升到3V或者3 ...