HDU1452:Happy 2004(数论 & 唯一分解)

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 are 1, 2, 3, 4, 6, 12, 167, 334, 501, 668, 1002 and 2004. Therefore S = 4704 and S modulo 29 is equal to 6. 
Input
The input consists of several test cases. Each test case contains a line with the integer X (1 <= X <= 10000000). 

A test case of X = 0 indicates the end of input, and should not be processed. 
Output
For each test case, in a separate line, please output the result of S modulo 29. 
Sample Input
1
10000
0
Sample Output
6
10
题意:给X,求2004的X次方的所有因子和mod 29。

思路:对于某个数的因子和,加入分解成p1^a1*p2^a2,因子和和(p1^0+p1*1+...p1^a1)*(p2^0+p2*1+...p2^a2),可以化成等比数列求和,X次方就ai*X即可,最后要处理下逆元。

# include <iostream>
# include <cstdio>
# include <set>
# include <algorithm>
using namespace std;
const int mod = 29;
int a[6], b[6], cnt=0;
int qmod(int x, int y)
{
    int ans = 1;
    for(;y;y>>=1)
    {
        if(y&1) ans = ans*x%mod;
        x = x*x%mod;
    }
    return ans;
}
int main()
{
    int j=2004;
    for(int i=2; i*i<=j; ++i)
    {
        if(j%i == 0)
        {
            a[cnt] = i;
            while(j%i == 0) j /= i, ++b[cnt];
            ++cnt;
        }
    }
    if(j) a[cnt] = j, b[cnt++] = 1;
    int x;
    while(~scanf("%d",&x),x)
    {
        int c[6], ans = 1, tmp;
        for(int i=0; i<cnt; ++i) c[i] = b[i]*x;
        for(int i=0; i<cnt; ++i)
        {
            tmp = (qmod(a[i], c[i]+1)-1+mod)%mod * qmod(a[i]-1, mod-2)%mod;
            ans = ans*tmp%mod;
        }
        printf("%d\n",ans);
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值