因式分解,算术基本定理,积性函数(POJ 1452 Happy2004)

本文探讨了积性函数的概念及其在数学问题解决中的应用,特别是通过算术基本定理分解正整数并求解特定形式的因子和。以POJ1452为例,展示了如何利用积性函数的性质高效计算2004^x的所有因子和,通过等比数列求和公式简化计算过程。
摘要由CSDN通过智能技术生成
  •  积性函数:是指对于所有互质的整数a和b有性质f(ab) = f(a) * f(b)
  •  算术基本定理:任何一个大于1的正整数都能唯一分解为有限个质数的乘积,即N = p1^x1 * p2^x2 * p3^x3 * .... * pn^xn

POJ 1452:

题意:求2004^x的所有因子和,

           输入x

           输出:结果

题解:

/*****************解法*****************/
/*
 * 设S(x)表示x的因数和
 * 积性函数:是指对于所有互质的整数a和b有性质f(ab) = f(a) * f(b)
 * 算术基本定理:任何一个大于1的正整数都能唯一分解为有限个质数的乘积,即N = p1^x1 * p2^x2 * p3^x3 * .... * pn^xn

   2004 = 2^2 * 3 * 167
   2004^x = 2^2x * 3^x * 167^x

 * 证明:S(N) = S(p1^x1) * S(p2^x2) * S(p3^x3) * ..... * S(pn^xn)
   * 首先举个例子 N = ab,S(ab) = S(a) * S(b)    且a和b都为质数
   * 如果单纯来看N这个数字的因子有:1, a, b, ab
   * 则 S(N) = 1 + a + b + ab;
   * S(a) = 1+a,   S(b) = 1+b;
   * 所以 S(ab) = S(a) * S(b) 成立,则满足积性函数

 * 对于其中一项,如p^x的所有因数和不就是自生p不断组合的和吗,而p的组合有:
                p, p^2, p^3, p^4, ........
   则:p^x的因数和 = 1 + p + p^2 + p^3 + p^4 + ..... + p^x
       很明显该式为等比数列,即(p^(x+1) - 1) / (p - 1)


 **下面开始解法:
  * 设S(x)表示x的因数和,inverse(x)表示x的逆元
  * S(2004^x) = S(2 ^ 2x) * S(3 ^ x) * S(167 ^ x)
  * S(2 ^ 2x) = (2^(2x+1) - 1)
  * S(3 ^ x) = (3^(x+1) - 1) / 2
  * S(167^x) = (167^(x+1) - 1) / 166
  * S(2004^x) = (2^(2x+1) - 1) + (3^(x+1) - 1) / 2 + (167^(x+1) - 1) / 166  有一项不是质数不能求逆元
  * 因为29对S取模,所以S(167 ^ x) % 29 = S(22^x)

  * 则 S(2004 ^ x) = (2^(2x+1)%mod - 1) + (3^(x+1)%mod - 1) * inverse(2) + (22^(x+1)-1) * inverse(21)





*/
/*****************解法*****************/


#include<bits/stdc++.h>

using namespace std;
typedef long long LL;

const int mod = 29;

int quick_mod(int a, int b){
    LL ans = 1;
    a %= mod;
    while(b){
        if(b & 1){
            ans = ans *a % mod;
            b--;
        }
        b >>= 1; a = a * a % mod;
    }
    return ans;
}

int inverse(int a){
    int ans = 1;
    int b = mod-2;
    a %= mod;
    while(b){
        if(b & 1){
            ans = ans * a % mod;
            b--;
        }
        b >>= 1; a = a * a % mod;
    }
    return ans;
}

int main()
{
    int n;
    while(scanf("%d", &n) && n){
        int ans = 1;
        ans *= quick_mod(2, 2*n+1) - 1; ans %= mod;
        ans *= (quick_mod(3, n+1) - 1) * inverse(2); ans %= mod;
        ans *= (quick_mod(22, n+1) - 1) * inverse(21); ans %= mod;
        ans %= mod;

        printf("%d\n", ans);
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值