HDU 1452 Happy 2004

题目意思:求2004^x的所有正因数的和对29求余

解析:

我们用s(x)表示x的因子和:

2的因子为1,2,s(2)=3;

3的因子为1,3,s(3)=4;

6的因子为1,2,3,6,s(6)=12;

可以发现:s(6)=s(2)*s(3)=3*4=12;

4的因子为1,2,4,,s(4)=7;

5的因子为1,5,s(5)=6;

20的因子为1,2,4,5,10,20,s(20)=42;

可以发现:s(20)=s(4)*s(5)=7*6=42;

s(25)=1+5+25=31

再看s(50)=1+2+5+10+25+50=93=3*31=s(2)*s(25)

这在数论中称为积性函数。

数论中积性函数的定义:对于正整数n的一个算术函数 f(n),若f(1)=1,且当a,b互质时f(ab)=f(a)f(b),在数论上就称它为积性函数。若对于某积性函数 f(n) ,就算a, b不互质,也有f(ab)=f(a)f(b),则称它为完全积性的。

因为2004=2^2*3^1*167,因此s(2004^x)=s(2^(2x)*3^x*167^x)=s(2^(2x))*s(3^x)*s(167^x)

令a=s(2^(2x)),b=s(3^x),c=s(167^x),由于同余性质:167=22(mod29),167可以用22代替,c=s(22^x).

同时,如果p是一个素数,则s(p^n)=p^0+p^1+P^2+......p^n,可以发现这是一个等比数列求和,因此s(p^n)=p^0(1-p^(n+1))/(1-p)=(p^(n+1)-1)/(p-1)......①

由①式得:a=s(2^(2x))=(2^(2x+1)-1)/1

b=s(3^x)=(2^(x+1)-1)/2

c=s(22^x)=(22^(x+1)-1)/21

而b与c不能直接计算,对于取模运算有如下规则:1. (a*b) %p= ( a%p) *(b%p)

2. (a/b) %p= ( a *b^(-1)%p)

b^(-1)(mod p)是b的逆元,2的逆元素为15,因为2*15%29=1%29,21的逆元素为18,因为21*18%29=1%29

在计算(a/b)%Mod时,往往需要先计算b%Mod的逆元p(b有逆元的条件是gcd(b,Mod)==1,显然素数肯定有逆元),然后由(a*p)%Mod得结果c。这里b的逆元p满足(b*p)%Mod=1

这里做简单的证明:(a/b)%Mod=c;    (b*p)%Mod=1;    ==》   (a/b)*(b*p) %Mod=c;    ==》    (a*p)%Mod=c;

求逆元可以用扩展欧几里得实现,假设已知b,mod,用扩展欧几里得求出bx+mody=1的一组解,两边同时%mod可得bx%mod=1%mod,因此x即为b%mod的逆元

综上所诉,题目中的a=(2^(2x+1)-1)%29

b=(2^(x+1)-1)*15%29

c=(22^(x+1)-1)/*18%29

ans=a*b*c%29

abc三项直接用快速幂求解即可,代码如下

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
#define LL long long
using namespace std;
LL pow_mod(LL a,LL n)
{
    LL ans=1;
    a=a%29;
    while(n)
    {
        if(n&1)ans=(ans*a)%29;
        a=a*a%29;
        n>>=1;
    }
    return ans;
}
int main()
{
    LL x,a,b,c;
    while(scanf("%I64d",&x)&&x)
    {
        a=(pow_mod(2,2*x+1)-1)%29;
        b=(pow_mod(3,x+1)-1)*15%29;
        c=(pow_mod(22,x+1)-1)*18%29;
        printf("%I64d\n",(a*b)%29*c%29);
    }
}
时间: 2024-10-23 13:18:45

HDU 1452 Happy 2004的相关文章

HDU 1452 Happy 2004(因子和的积性函数)

题目链接 题意 : 给你一个X,让你求出2004的X次方的所有因子之和,然后对29取余. 思路 : 原来这就是积性函数,点这里这里这里,这里讲得很详细. 在非数论的领域,积性函数指所有对于任何a,b都有性质f(ab)=f(a)f(b)的函数. 在数论中的积性函数:对于正整数n的一个算术函数 f(n),若f(1)=1,且当a,b互质时f(ab)=f(a)f(b),在数论上就称它为积性函数. 若对于某积性函数 f(n),就算a, b不互质,也有f(ab)=f(a)f(b),则称它为完全积性的. s(

hdu 1452 Happy 2004 膜拜这推导过程

Happy 2004 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 920    Accepted Submission(s): 648 Problem Description Consider a positive integer X,and let S be the sum of all positive integer divis

HDU 1452 Happy 2004 数论

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1452 题目描述: 让你求2004^x的所有因数之和, 模29 解题思路: 先将2014质因数分解, 2^2 * 3 * 167, 所以所有因数的个数就是(2x+1)*(x+1)*(x+1) , 我们列出公式, 相当于一个空间直角坐标系, 我们先将x, y平面上的点相加, 再加z轴上的, 最后得出公式 ans = (3^(x+1)-1) * (167^(x+1)-1)*(2^(2*x+1)-1)/3

HDU 1452 Happy 2004(唯一分解定理)

题目链接:传送门 题意: 求2004^x的所有约数的和. 分析: 由唯一分解定理可知 x=p1^a1*p2^a2*...*pn^an 那么其约数和 sum = (p1^0+p1^1^-+p1^a1)*-* (pn^0+pn^1^-+pn ) 代码如下: #include <iostream> #include <cstring> #include <algorithm> #include <cstdio> using namespace std; const

hdu 1452 Happy 2004 (快速幂+取模乘法逆元)

Problem Description Consider a positive integer X,and let S be the sum of all positive integer divisors of 2004^X. Your job is to determine S modulo 29 (the rest of the division of S by 29).Take X = 1 for an example. The positive integer divisors of

HDU 1452 Happy 2004 求2004^n的所有因子和 积性函数应用

题目链接:点击打开链接 百度个题解:点击打开链接 6的因子是1,2,3,6; 6的因子和是 s(6)=1+2+3+6=12; 20的因子是1,2,4,5,10,20; 20的因子和是 s(20)=1+2+4+5+10+20=42; 2的因子是1,2; 2的因子和是 s(2)=1+2=3; 3的因子是1,3; 3的因子和是 s(3)=1+3=4; 4的因子和是 s(4)=1+2+4=7; 5的因子和是 s(5)=1+5=6; s(6)=s(2)*s(3)=3*4=12; s(20)=s(4)*s(

hdu 1425 Happy 2004

题目链接 hdu 1425 Happy 2004 题解 题目大意: 求 \[\sum_{d|2004^{x}}d\ mod\ 29\] 记为\(s(2004^x)\) \(sum(2004^{x})= s(2^2X)) * s(3^X) * s(167^X)\) $167?mod?29 = 22 $ \(s(2004^X) = s(2^{2X}) * s(3^{X})) * s(22^X)\) 此时底数变为了质数 如果p是素数 \(s(p^n)=1+p+p^2+...+p^n= (p^{n+1}

HDU 1452 FZU 1053 Happy 2004(逆元函数+因子和函数+大指数取模化简公式)

Description Consider a positive integer X,and let S be the sum of all positive integer divisors of 2004^X. Your job is to determine S modulo 29 (the rest of the division of S by 29). Take X = 1 for an example. The positive integer divisors of 2004^1

HDU 1452 (约数和+乘法逆元)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1452 题目大意:求2004^X所有约数和,结果mod 29. 解题思路: ①整数唯一分解定理: 一个整数A一定能被分成:A=(P1^K1)*(P2^K2)*(P3^K3).....*(Pn^Kn)的形式.其中Pn为素数. 如2004=(22)*3*167. 那么2004x=(22x)*(3x)*(167x). ②约数和公式 对于一个已经被分解的整数A=(P1^K1)*(P2^K2)*(P3^K3)