poj 2480 欧拉函数+积性函数+GCD

题目:http://poj.org/problem?id=2480

首先要会欧拉函数:先贴欧拉函数的模板,来源于吉林大学的模板:

//欧拉函数PHI(n)表示的是比n小,并且与n互质的正整数的个数(包括1)。
unsigned euler(unsignedx)
{// 就是公式
    unsigned i, res=x;
    for(i = 2; i < (int)sqrt(x * 1.0) + 1; i++)
        if(x%i==0) {
            res = res / i * (i - 1);
            while(x % i == 0) x /= i; // 保证i一定是素数
    }
    if(x > 1) res = res / x * (x - 1);
    return res;
}

然后欧拉函数在本题中用到的一些性质:

1.当n为素数时,PHI(n)
= n - 1。因为每个比n小的正整数都和n互素。当n为素数p的k次方时,PHI(n)
= p ^ k - p ^ (k - 1)。因为在1到n之间的正整数只有p的倍数和n不互素,这样的数有(p
^ k / p)个。

2. 如果m和n互素,即GCD(m,
n) = 1,那么PHI(m * n) = PHI(m) * PHI(n)。

然后说本题:

我参考了这个题解,代码也看了o(╯□╰)o,不过人家写的很好啊,膜拜~~

http://blog.csdn.net/terry__j/article/details/7403923

然后贴我的代码:

/****************************************欧拉函数+积性函数
    by Pilgrim 2014.5.10
注意:1、//ans=ans*(1+ai*(i-1)/i);--WA,二逼了
         ai/i很可能不是整除,所以这么写
          ans=ans+ans*ai*(i-1)/i;
\****************************************/

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <climits>
#include <cmath>

using namespace std;

#define lint long long

int main()
{
    lint n,sqr,tmp,ai,ans,ret;

    while(scanf("%lld",&n)!=EOF)
    {
        tmp=n;
        ans=n;
        sqr = (lint)sqrt(n*1.0)+1;
        for(lint i=2;i<sqr;i++)
        {
            if(tmp%i == 0)
            {
                tmp/=i,ai=1;
                while(tmp%i == 0)tmp/=i,ai++;

                //ans=ans*(1+ai*(i-1)/i);
                ans=ans+ans*ai*(i-1)/i;
            }
        }
        if(tmp!=1)//ans=ans*(1+(tmp-1)/tmp);
            ans=ans+ans*(tmp-1)/tmp;
        printf("%lld\n",ans);
    }

    return 0;
}

poj 2480 欧拉函数+积性函数+GCD

时间: 2024-10-12 14:59:22

poj 2480 欧拉函数+积性函数+GCD的相关文章

poj 2480 Longge&#39;s problem 积性函数性质+欧拉函数

题意: 求f(n)=∑gcd(i, N) 1<=i <=N. 分析: f(n)是积性的数论上有证明(f(n)=sigma{1<=i<=N} gcd(i,N) = sigma{d | n}phi(n / d) * d ,后者是积性函数),可以这么解释:当d是n的因子时,设1至n内有a1,a2,..ak满足gcd(n,ai)==d,那么d这个因子贡献是d*k,接下来证明k=phi(n/d):设gcd(x,n)==d,那么gcd(x/d,n/d)==1,所以满足条件的x/d数目为phi(

POJ 2480 Longge&#39;s problem 积性函数

题目来源:POJ 2480 Longge's problem 题意:求i从1到n的gcd(n, i)的和 思路:首先如果m, n 互质 gcd(i, n*m) = gcd(i, n)*gcd(i, m) 这是一个积性函数积性函数的和还是积性函数 由欧拉函数知识得 phi(p^a) = p^a - p^(a-1) p是素数 a是正整数 得到最终答案f(n) = f(p1^a1)*f(p2^a2)*...*f(pn^an) 其中f(p^a) = a*(p^a-p^(a-1))+p^a #includ

HDU 4002 Find the maximum (欧拉函数-积性函数的性质(2011年大连赛区网络赛第二题)

[题目链接]:click here~~ [题目大意]: 给出一个整数n,求一个数x,x在1到n之间,并且x/φ(x)最大(其中φ(x)为x的欧拉函数). [思路]: 由欧拉函数为积性函数,即:如果 则有: 且: 则有: 要使f(x)最大,须使x含尽量多的不同素数因子. 代码: /* * Problem: HDU No.4002 * Running time: 1700MS * Complier: java * Author: javaherongwei * Create Time: 0:08 2

poj 2480 Longge&amp;#39;s problem 积性函数性质+欧拉函数

题意: 求f(n)=∑gcd(i, N) 1<=i <=N. 分析: f(n)是积性的数论上有证明(f(n)=sigma{1<=i<=N} gcd(i,N) = sigma{d | n}phi(n / d) * d ,后者是积性函数),能够这么解释:当d是n的因子时,设1至n内有a1,a2,..ak满足gcd(n,ai)==d,那么d这个因子贡献是d*k,接下来证明k=phi(n/d):设gcd(x,n)==d,那么gcd(x/d,n/d)==1,所以满足条件的x/d数目为phi(

POJ 2480 Longge&amp;#39;s problem 积性函数

题目来源:POJ 2480 Longge's problem 题意:求i从1到n的gcd(n, i)的和 思路:首先假设m, n 互质 gcd(i, n*m) = gcd(i, n)*gcd(i, m) 这是一个积性函数积性函数的和还是积性函数 由欧拉函数知识得 phi(p^a) = p^a - p^(a-1) p是素数 a是正整数 得到终于答案f(n) = f(p1^a1)*f(p2^a2)*...*f(pn^an) 当中f(p^a) = a*(p^a-p^(a-1))+p^a #includ

POJ2480 Longge&#39;s problem 欧拉函数的应用 &amp;&amp; 积性函数

题意很简单,求sum(gcd(i,n))   1<=i<=n; 这题看到后第一反应并没有里用积性函数的性质,不过也可以做,欣慰的是我反应还是比较快的 设f(n)=gcd(1,n)+gcd(2,n)+....+gcd(n-1,n) + gcd(n,n), 用g(n,i)表示满足 gcd(x,n)=i的 x的个数 (x小于n),则 f(n)=sum{i*g(n,i)}; 同时又利用 扩展欧几里德的性质  gcd(x,n)=i  的充要条件是 gcd(x/i,n/i)==1,所以 满足 x/i的解有

欧拉函数和积性函数

欧拉函数和积性函数 欧拉函数: 积性函数: 欧拉定理: ax≡1(modb)的意思: a*x 和 1关于 b 同余 也就是 a * x-1是 b 的倍数. 费马小定理: 原文地址:https://www.cnblogs.com/fisherss/p/9994381.html

hdu2421-Deciphering Password-(欧拉筛+唯一分解定理+积性函数+立方求和公式)

Deciphering Password Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2357    Accepted Submission(s): 670 Problem Description Xiaoming has just come up with a new way for encryption, by calculati

spoj 3871. GCD Extreme 欧拉+积性函数

3871. GCD Extreme Problem code: GCDEX Given the value of N, you will have to find the value of G. The meaning of G is given in the following code G=0; for(k=i;k< N;k++) for(j=i+1;j<=N;j++) { G+=gcd(k,j); } /*Here gcd() is a function that finds the g