poj2480(利用欧拉函数的积性求解)
题目链接: http://poj.org/problem?id=2480
题意:∑gcd(i, N) 1<=i <=N,就这个公式,给你一个n,让你求sum=gcd(1,n)+gcd(2,n)+gcd(3,n)+…………gcd(n-1,n)+gcd(n,n),(1<=n<2^31)是多少?
放心吧!!!暴力肯定是做不出来的,如果你数论只会gcd(和我一样),那还是学点东西再来挑战这个题吧!
这个题需要用到欧拉函数的知识……
欧拉函数的定义:对正整数n,欧拉函数是小于n的正整数中与n互质的数的数目(我们定义φ(1)=1)
欧拉函数的的通式:φ(n)=n*(1-1/p1)*(1-1/p2)*(1-1/p3)……*(1-1/ps)(p1,p2,p3,……ps均是n的质因子)
欧拉函数有这么几个比较重要的性质:
性质1:如果n是质数p的k次幂,那么φ(n)=p^k-1*(p-1)
性质2:欧拉函数是积性函数——若m,n互质,φ(mn)=φ(n)*φ(m),积性函数和完全积性函数有区别,有兴趣可以自己百度一下
性质3:当n为奇数的时候,φ(2n)=φ(n),这一点是由性质2推出来的,因为2必定和所有的奇数都是互质的,所以而φ(2)=1。所以得出这个结果
性质4:n的所有质因子之和等于φ(n)*n/2(这不算性质,只能算延伸)。
好了,大体介绍完了欧拉函数,我们可以开始来看看这个题怎么做了。
首先要知道gcd(i,n)是积性函数(当n固定时),也就是说gcd(i*j,n)=gcd(i,n)*gcd(j,n)(这里还有一个限制条件,就是i,j互质,所以gcd并非完全积性函数)
一开始我不是利用积性函数的性质做的,但是也用到了欧拉函数,因为一眼就和欧拉函数有关一下就手撕了,相当于半暴力吧,344ms,好丢人,这里也说下是怎么做的。
我们枚举gcd(i,n)的所有情况即n的所有因子都有可能是他和其他数的最大公因数。我们假设M是n与i的最大公因数,那么所有与i互质且小于i的数与M的乘积我们设这个数为j,与n的最大公因数都为M,即gcd(j,n)=M,.这里所有与i互质且小于i的数也就是i的欧拉函数φ(i)而i=n/M。
但是我们直接1-n去枚举n的所有因子设为M,来枚举最大公约数的所有情况答案需要n的复杂度,在2^31次方的情况下是会超时的,所以我们采用折半枚举,具体看代码吧
//Author: xiaowuga
#include<iostream>
#include<cmath>
#define maxx INT_MAX
#define minn INT_MIN
#define inf 0x3f3f3f3f
const long long N=;
using namespace std;
typedef long long LL;
LL euler(LL n){
LL res=n;
for(LL 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;
}
int main(){
LL n;
while(scanf("%lld",&n)!=EOF){
LL ans=;
for(LL i=;i*i<=n;i++){
if(n%i==){
ans+=euler(n/i)*i;
if(i*i<n) ans+=euler(i)*(n/i);
}
}
printf("%lld\n",ans);
}
return ;
}
好了现在我们需要来学习真正的姿势了,我也是刚学的,利用gcd是积性函数的性质,根据前文说的,我们有这样的结论:n>1时 n=p1^a1*p2^a2*...*ps^as,p为n的质因子,那么f(n)是积性函数的充要条件是f(1)=1,及f(n) = f(p1^a1)*f(p2^a2)*...f(pr^ar),所以只要求f(pi^ai)就好。现在来看具体做法。
f(pi^ai) = Φ(pi^ai)+pi*Φ(pi^(ai-1))+pi^2*Φ(pi^(ai-2))+...+pi^(ai-1)* Φ(pi)+ pi^ai *Φ(1)
根据性质1,我们可以做出如下化简
f(pi^ai)=[pi^(ai-1)*(pi-1) ] + [pi*pi^(ai-2)*(pi-1)] + [pi^2*pi^(ai-3)*(pi-1)] + [pi^3*pi^(ai-4)*(pi-1)]....[pi^(ai-1)*pi^(ai-ai)*(pi-1)]+pi^ai ①
然后对①提取公因子(pi-1)
f(pi^ai)=(pi-1){[pi^(ai-1) ] + [pi*pi^(ai-2)] + [pi^2*pi^(ai-3)] + [pi^3*pi^(ai-4)]....[pi^(ai-1)*pi^(ai-ai)]+[pi^ai/(pi-1)]} ②
紧接着我们发现出了最后一项每个[]每个方括号内乘积都等于pi^(ai-1),所以对②提取公因子pi^(ai-1)
f(pi^ai)=(pi-1)*pi^(ai-1)*{ai+[pi/(pi-1)]} ③
然后把(pi-1)/pi放进括号里得
f(pi^ai)=pi^(ai)*{1+ai*(pi-1)/pi} ④
这个 ④是单个f(pi^ai)的公式,我们提取所有的pi^(ai)相乘实际上就是n了,所以我们可以得到f(n)的公式:f(n)=n*∏(1+ai*(pi-1)/pi)
然后我们看代码吧!
//Author: xiaowuga
#include<iostream>
#include<cmath>
#define maxx INT_MAX
#define minn INT_MIN
#define inf 0x3f3f3f3f
const long long N=;
using namespace std;
typedef long long LL;
int main() {
ios::sync_with_stdio(false);cin.tie();
int n;
while(cin>>n){
LL i,sqr,p,a,ans;
ans=n;
sqr=floor(sqrt(1.0*n));
for(int i=;i<=sqr;i++){
if(n%i==){
a=;p=i;
while(n%p==){
a++;n/=p;
}
ans=ans+ans*a*(p-)/p;
}
}
if(n!=) ans=ans+ans*(n-)/n;
cout<<ans<<endl;
}
return ;
}
poj2480(利用欧拉函数的积性求解)的更多相关文章
- 51nod1040 最大公约数之和,欧拉函数或积性函数
1040 最大公约数之和 给出一个n,求1-n这n个数,同n的最大公约数的和.比如:n = 6时,1,2,3,4,5,6 同6的最大公约数分别为1,2,3,2,1,6,加在一起 = 15 看起来很简单 ...
- HDU 6390 GuGuFishtion(莫比乌斯反演 + 欧拉函数性质 + 积性函数)题解
题意: 给定\(n,m,p\),求 \[\sum_{a=1}^n\sum_{b=1}^m\frac{\varphi(ab)}{\varphi(a)\varphi(b)}\mod p \] 思路: 由欧 ...
- poj 2773 利用欧拉函数求互质数
题意:找到与n互质的第 k个数 开始一看n是1e6 敲了个暴力结果tle了,后来发现k达到了 1e8 所以需要用到欧拉函数. 我们设小于n的 ,与n互质的数为 (a1,a2,a3.......a(p ...
- 牛客小白月赛12-C(欧拉筛解积性方程)
题目链接:https://ac.nowcoder.com/acm/contest/392/C 题意:给定n,求: 思路:令res[i]=iN (%MOD),因为xn是一个积性函数,即(x*y)n=x ...
- 积性函数&线性筛&欧拉函数&莫比乌斯函数&因数个数&约数个数和
只会搬运YL巨巨的博客 积性函数 定义 积性函数:对于任意互质的整数a和b有性质f(ab)=f(a)f(b)的数论函数. 完全积性函数:对于任意整数a和b有性质f(ab)=f(a)f(b)的数论函数 ...
- poj2407 Relatives 欧拉函数基本应用
题意很简单 就是欧拉函数的定义: 欧拉函数是指:对于一个正整数n,小于n且和n互质的正整数(包括1)的个数,记作φ(n) .题目求的就是φ(n) 根据 通式:φ(x)=x*(1-1/p1)*(1-1/ ...
- hdu 2824 The Euler function(欧拉函数)
题目链接:hdu 2824 The Euler function 题意: 让你求一段区间的欧拉函数值. 题解: 直接上板子. 推导过程: 定义:对于正整数n,φ(n)是小于或等于n的正整数中,与n互质 ...
- Bi-shoe and Phi-shoe (欧拉函数)
题目描述: 题目大意:一个竹竿长度为p,它的score值就是比p长度小且与且与p互质的数字总数,比如9有1,2,4,5,7,8这六个数那它的score就是6.给你T组数据,每组n个学生,每个学生都有一 ...
- 欧拉函数(小于或等于n的数中与n互质的数的数目)&& 欧拉函数线性筛法
[欧拉函数] 在数论,对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目.此函数以其首名研究者欧拉命名,它又称为Euler’s totient function.φ函数.欧拉商数等. 例如φ( ...
随机推荐
- 使用Guava的RateLimiter完成简单的大流量限流
限流的一般思路: 1.随机丢弃一定规则的用户(迅速过滤掉90%的用户): 2.MQ削峰(比如设一个MQ可以容纳的最大消息量,达到这个量后MQ给予reject): 3.业务逻辑层使用RateLimite ...
- 单片机成长之路(51基础篇) - 022 N76e003 APROM模拟EEPROM驱动
N76e003单片机内部没有EEPROM,但是可以使用 APROM模拟EEPROM功能,代码如下: eeprom.h #ifndef _EEPROM_H_ #define _EEPROM_H_ //E ...
- 自建证书配置HTTPS服务器
1.写这篇博客的初衷是因为最近iOS9出来了,苹果官方默认要求使用HTTPS,所以自己想整一个HTTPS服务器,也想好好了解一下HTTPS通信,也知道了HTTPS其实就是在HTTP的基础上加上了SSL ...
- 分析轮子(二)- << ,>>,>> (左移、右移、无符号右移)
前言:写 分析轮子(一)-ArrayList.java 的时候看到源码中有 int newCapacity = oldCapacity + (oldCapacity >> 1); 这样的代 ...
- redis应用-sortedset实现排行榜(转载)
package site.zy9.redisApp.test; import java.util.HashMap; import java.util.List; import java.util.Ma ...
- TensorFlow精选Github开源项目
转载于:http://www.matools.com/blog/1801988 TensorFlow源码 https://github.com/tensorflow/tensorflow 基于Tens ...
- linux下fallocate快速创建大文件
以前创建文件我一般用dd来创建,例如创建一个512M的文件: dd命令可以轻易实现创建指定大小的文件,如 dd if=/dev/zero of=test bs=1M count=1000 会生成一个1 ...
- 爬虫对自己服务器 CPU,内存和网速的影响
今天无事写一遍关于爬虫对计算机的影响,主要是给小白同学普及一下爬虫的基础知识. 在我们写爬虫的时候,首先会想到开多线程,如果使用的语言是Python,很不幸,因为Python存在 GIL,在任何时候 ...
- [k8s] flexvolume workflow
- Software Engineer Title Ladder
http://changelog.ca/log/2013/08/09/software_engineer_title_ladder Within the software engineering pr ...