hdu1452

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1452

题目大意:

求2004^x的因子和对于29取模的结果。

题解:

2004的素因子只有:2,3,167.

2004^x的因子和可以分解成:

sum=\frac{r}{332}

r=\left ( 2^{2x+1}-1 \right )*\left ( 3^{x+1}-1 \right )*\left ( 167^{x+1}-1 \right )

332关于29的逆元是9

除法取模求逆元。

ac代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define mod 29
ll mul(ll a, ll n)    //快速幂 a^n % p
{
    ll ans = 1;
    while(n)
    {
        if(n & 1) ans = ans * a % mod;          //若不取模就去掉p
        a = a * a % mod;
        n >>= 1;
    }
    return ans;
}

int main(){
    long long a,x,y,z;
    while(cin>>a&&a){               //当gcd(a,b)=1时 s(a*b)=s(a)*s(b);
    x=mul(2,2*a+1)-1;        //s(p^n)=1+p+p^2+...+p^n= (p^(n+1)-1)/(p-1)
    y=mul(3,a+1)-1;            //s(2004^X)=s(2^2X)*s(3^X)*s(167^X)
    z=mul(167,a+1)-1;          //s(2^2X)=2^(2X+1)-1
    z=z*9;                          //s(3^X)=(3^(X+1)-1)/2
    cout<<x*y*z%mod<<endl;          //s(167^X)=(167^(X+1)-1)/166
    }                               //直接求332对29的逆元为9
	return 0;
} 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值