这道题是欧拉函数的使用,这里简要介绍下欧拉函数。

  欧拉函数定义为:对于正整数n,欧拉函数是指不超过n且与n互质的正整数的个数。

  欧拉函数的性质:1.设n = p1a1p2a2p3a3p4a4...pkak为正整数n的素数幂分解,那么φ(n) = n·(1-1/p1)·(1-1/p2)·(1-1/p3)···(1-1/pk)

          2.如果n是质数,则φ(n) = n-1;  反之,如果p是一个正整数且满足φ(p)=p-1,那么p是素数。

          3.设n是一个大于2 的正整数,则φ(n)是偶数

          4.当n为奇数时,有φ(2n)=φ(n)

          5.设m和n是互质的正整数,那么φ(mn)=φ(m)φ(n)

(1)可以根据性质1,写出计算欧拉函数值的程序:  复杂度为O(√n)

 //直接求解欧拉函数
int euler(int n){ //返回euler(n)
int res=n;
for(int i=;i*i<=n;i++){
if(n%i==){
res=res/i*(i-);//先进行除法是为了防止中间数据的溢出
while(n%i==) n/=i;
}
}
if(n>) res=res/n*(n-);
return res;
}

(2)上面这种写法中,在for循环中选择i时,是顺序选择的。事实上性质1 中的p1、p2、p3、p4、...pk都是质数。如果在选择时,直接选择质数进行判断,那结果会优化很多。

可以先把50000以内的素数用筛法选出来并保存,以方便欧拉函数使用。这样,在不考虑筛法的时间复杂度,而单看欧拉函数,其复杂度变为O(x),x为√n以内素数的个数。

 #include <cstring>
bool boo[];int p[]; void prim(){
//线性筛素数
memset(boo,,sizeof(boo));
boo[]=boo[]=;
int k=;
for(int i=;i<;i++){
if(!boo[i]) p[k++]=i;
for(int j=;j<k&&i*p[j]<;j++){
boo[i*p[j]] = ;
count++;
if(!(i%p[j])) break;
}
} } int phi(int n){
int rea = n;
for(int i=;p[i]*p[i]<=n;i++ ){ //对一些不是素数的可不用遍历
if(n%p[i]==){
rea = rea-rea/p[i];
while(n%p[i]==) n/=p[i];
}
}
if(n>) rea-=rea/n;
return rea;
}

(3)递推求欧拉函数

    如果频繁的要使用欧拉函数值,就需要预先打表。复杂度约为O(nlnn)

 //递推法打欧拉函数表
#define Max 1000001
int phi[Max];
void Init(){
for(int i=;i<=Max;i++) phi[i]=i;
for(int i=;i<=Max;i+=) phi[i]/=;
for(int i=;i<=Max;i+=)
if(phi[i]==i)
for(int j=i;j<=Max;j+=i)
phi[j]=phi[j]/i*(i-);//先进行除法是为了防止中间数据的溢出
}

应用:NYOJ 998   http://acm.nyist.net/JudgeOnline/problem.php?pid=998

这道题的精华如何将符合条件的gcd(x,n)表达出来:见代码  d*Euler(n/d)  中为什么乘以d的解释  。

然后是遍历一遍小于n的数,测试每个符合的数加起来即可。其实还可以更快,观察发现,在能够整除n的i里面,相对应的n/i也有相似的性质,这样以来只需要遍历到sqrt(n)即可。

网络摘抄代码如下:

 #include<iostream>
#include<cstdio>
using namespace std; typedef long long LL;
LL Euler(LL n){
LL ans = n;
for(int i = ; i * i <= n; i++){
if(n % i == ){
ans = ans / i * (i-);
while(n % i == )
n /= i;
}
}
if(n > ) ans = ans / n * (n-);
return ans;
} int main(){
LL n,m;
while(cin>>n>>m){
LL ans = ;
for(int i = ; i * i <= n; i++){
if(n % i == ){
if(i >= m){
int d = i;
ans += d*Euler(n/d);
// 考虑 gcd(x,n) 1=<x<=n
//这个的由来是 gcd(x/d,n/d) = 1.如果我们取一个能让n/d取整数的d的取值,于是我们
//取到了n%i==0的i,于是 能够满足gcd(x,n) = d 的x的个数为Euler(n/d)个
//那么在该gcd = d 的情况下需要加到ans里面的d的个数就是Euler(n/d)个 ,所以有ans+=d*Euler(n/d) }
if(i * i != n && n / i >= m){
int d = n / i;
ans += d*Euler(n/d);
}
}
}
cout<<ans<<endl;
}
return ;
}
												

NYOJ 998的更多相关文章

  1. NYOJ 1007

    在博客NYOJ 998 中已经写过计算欧拉函数的三种方法,这里不再赘述. 本题也是对欧拉函数的应用的考查,不过考查了另外一个数论基本定理:如何用欧拉函数求小于n且与n互质所有的正整数的和. 记eule ...

  2. NYOJ 333

    http://www.cppblog.com/RyanWang/archive/2009/07/19/90512.aspx?opt=admin 欧拉函数 E(x)表示比x小的且与x互质的正整数的个数. ...

  3. NYOJ 99单词拼接(有向图的欧拉(回)路)

    /* NYOJ 99单词拼接: 思路:欧拉回路或者欧拉路的搜索! 注意:是有向图的!不要当成无向图,否则在在搜索之前的判断中因为判断有无导致不必要的搜索,以致TLE! 有向图的欧拉路:abs(In[i ...

  4. nyoj 10 skiing 搜索+动归

    整整两天了,都打不开网页,是不是我提交的次数太多了? nyoj 10: #include<stdio.h> #include<string.h> ][],b[][]; int ...

  5. 简答哈希实现 (nyoj 138 找球号2)

    例题链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=138 代码目的:复习哈希用 代码实现: #include "stdio.h&qu ...

  6. nyoj 284 坦克大战 简单搜索

    题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=284 题意:在一个给定图中,铁墙,河流不可走,砖墙走的话,多花费时间1,问从起点到终点至少 ...

  7. nyoj 170 网络的可靠性

    题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=170 思路:统计每个节点的度,将度为1的节点消去所需要的最少的边即为答案. 代码: #in ...

  8. nyoj 139 我排第几个--康拓展开

    我排第几个 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 现在有"abcdefghijkl”12个字符,将其所有的排列中按字典序排列,给出任意一种排列,说 ...

  9. 基于贪心算法的几类区间覆盖问题 nyoj 12喷水装置(二) nyoj 14会场安排问题

    1)区间完全覆盖问题 问题描述:给定一个长度为m的区间,再给出n条线段的起点和终点(注意这里是闭区间),求最少使用多少条线段可以将整个区间完全覆盖 样例: 区间长度8,可选的覆盖线段[2,6],[1, ...

随机推荐

  1. ASP.NET Aries 入门开发教程3:开发一个列表页面及操控查询区

    前言: Aries框架毕竟是开发框架,所以重点还是要写代码的,这样开发人员才不会失业,哈. 步骤1:新建html 建一个Html,主要有三步: 1:引入Aries.Loader.js 2:弄一个tab ...

  2. SQL Server 常用内置函数(built-in)持续整理

    本文用于收集在运维中经常使用的系统内置函数,持续整理中 一,常用Metadata函数 1,查看数据库的ID和Name db_id(‘DB Name’),db_name('DB ID') 2,查看对象的 ...

  3. 转:serialVersionUID作用

    汗,以前学了还忘了... Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的.在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本 ...

  4. Java 输出流中的flush方法

    转自:http://blog.csdn.net/jiyangsb/article/details/50984440 java中的IO流中的输出流一般都有flush这个操作,这个操作的作用是强制将缓存中 ...

  5. 理解 .NET Platform Standard

    相关博文:ASP.NET 5 Target framework dnx451 and dnxcore50 .NET Platform Standard:https://github.com/dotne ...

  6. JavaScript特性(attribute)、属性(property)和样式(style)

    最近在研读一本巨著<JavaScript忍者秘籍>,里面有一篇文章提到了这3个概念. 书中的源码可以在此下载.我将源码放到了线上,如果不想下载,可以直接访问在线网址,修改页面名就能访问到相 ...

  7. STM32F429 LCD程序移植

    STM32F429自带LCD驱动器,这一具有功能给我等纠结于屏幕驱动的程序员带来了很大的福音.有经验的读者一定有过这样的经历,用FSMC驱动带由控制器的屏幕时候,一旦驱动芯片更换,则需要重新针对此驱动 ...

  8. ionic第二坑——ionic 上拉菜单(ActionSheet)安卓样式坑

    闲话不说,先上图: 这是IOS上的显示效果,代码如下: HTML部分: <body ng-app="starter" ng-controller="actionsh ...

  9. PHP相关代码

    1 <html>  <head>       <meta http-equiv="content-type" content="text/h ...

  10. 【流量劫持】SSLStrip 的未来 —— HTTPS 前端劫持

    前言 在之前介绍的流量劫持文章里,曾提到一种『HTTPS 向下降级』的方案 -- 将页面中的 HTTPS 超链接全都替换成 HTTP 版本,让用户始终以明文的形式进行通信. 看到这,也许大家都会想到一 ...