求a^b的约数对mod取模

const int maxn=30000+5;

int prime[maxn];
void marktable(int n){
    memset(prime,0,sizeof(prime));
    for(int i=2;i<=n;i++){
        if(!prime[i]) prime[++prime[0]]=i;
        for(int j=1;j<=prime[0]&&prime[j]<=n/i;j++){
            prime[prime[j]*i]=1;
            if(i%prime[j]==0) break;
        }
    }
}
long long factor[100][2];
int fatCnt;
int getFactors(long long x){
    fatCnt=0;
    long long tmp=x;
    for(int i=1;prime[i]<=tmp/prime[i];i++){
        factor[fatCnt][1]=0;
        if(tmp%prime[i]==0){
            factor[fatCnt][0]=prime[i];
            while(tmp%prime[i]==0){
                factor[fatCnt][1]++;
                tmp/=prime[i];
            }
            fatCnt++;
        }
    }
    if(tmp!=1) {
        factor[fatCnt][0]=tmp;
        factor[fatCnt++][1]=1;
    }
    return fatCnt;
}
int mod,A,B;
template<class T,class T1> T fast_mod(T a,T b,T1 Mod){
    a%=mod;
    if(b==0) return 1;
    T ans=1,base=a;
    while(b!=0){
        if(b&1)ans=(ans*base)%Mod;
        base=(base*base)%Mod;
        b>>=1;
    }
    return ans;
}

long long sum(long long p,long long n){
    if(p==0) return 0;
    if(n==0) return 1;
    if(n&1) return ((1+fast_mod(p,n/2+1,mod))%mod*sum(p,n/2)%mod)%mod;
    else return ((1+fast_mod(p,n/2+1,mod))%mod*sum(p,n/2-1)+fast_mod(p,n/2,mod)%mod)%mod;
}
long long solve(long long A,long long B){
    getFactors(A);
    long long ans=1;
    for(int i=0;i<fatCnt;i++){
        ans*=sum(factor[i][0],B*factor[i][1])%mod;
        ans%=mod;
    }
    return ans;
}

原文地址:https://www.cnblogs.com/033000-/p/10088729.html

时间: 2024-08-07 14:15:03

求a^b的约数对mod取模的相关文章

a^b(快速幂) 求 a 的 b 次方对 p 取模的值。

题目详情 求 a 的 b 次方对 p 取模的值. 输入格式 三个整数 a,b,p在同一行用空格隔开. 输出格式 输出一个整数,表示a^b mod p的值. 数据范围 0≤a,b,p≤10^9 输入样例: 3 2 7 输出样例: 2 问题解决 正常来说,计算机每秒可运算10^7-10^8次(以c++语言来说)所以这题如果用循环一个个的来乘,最大有10^9的运算量,有可能超时.应采用快速幂算法,运算量则会降为log级别的! 以上面提供的数据来说明 快速幂: 7转化为二进制为1112^0=12^1=2

hdu 5265 技巧题 O(nlogn)求n个数中两数相加取模的最大值

pog loves szh II Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 2106    Accepted Submission(s): 606 Problem Description Pog and Szh are playing games.There is a sequence with n numbers, Pog wi

取模和求余的区别

通常情况下取模运算(mod)和求余(rem)运算被混为一谈,因为在大多数的编程语言里,都用'%'符号表示取模或者求余运算.在这里要提醒大家要十分注意当前环境下'%'运算符的具体意义,因为在有负数存在的情况下,两者的结果是不一样的. 对于整型数a,b来说,取模运算或者求余运算的方法都是: 1.求 整数商: c = a/b; 2.计算模或者余数: r = a - c*b. 求模运算和求余运算在第一步不同: 取模求余运算在取c的值时,向0 方向舍入(fix()函数): 而求余取模运算在计算c的值时,向

[转]取模运算和求余运算的区别

[转]取模运算和求余运算的区别 通常情况下取模运算(mod)和求余(rem)运算被混为一谈,因为在大多数的编程语言里,都用'%'符号表示取模或者求余运算.在这里要提醒大家要十分注意当前环境下'%'运算符的具体意义,因为在有负数存在的情况下,两者的结果是不一样的. 对于整型数a,b来说,取模运算或者求余运算的方法都是: 1.求 整数商: c = a/b; 2.计算模或者余数: r = a - c*b. 通常常用的是正数之间取模或求余.下面的可以先不关心. —————————————————————

a ^ b mod c 取模运算优化反思(老物)

这是一篇嘲讽我之前的自己采用笨重愚蠢思想去解决问题的日志. RSA 加密与解密涉及到 a ^ b mod c 的问题,如何计算这个值呢? 我会选择 pow(a, b) % c, 事实上在写RSA的时候确实是这么干的,但现在看来真心愚蠢, 因为我为此不得不去实现了一个自己的大数四则运算库,也就是以数组为数(BigNum),而对于mod运算只需要换算为 A % B = A - ( A / B ) * B , 好吧,我自认为轮子准备充分了, 很快就写完了,也觉得很满意,也没什么不合适的地方,但现在开始

mongoDB 高级查询之取模查询$mod

http://hancang2000.i.sohu.com/blog/view/235140698.htm $mod取模运算 查询age取模10等于0的数据 db.student.find( { age: { $mod : [ 10 , 1 ] } } ) 举例如下: C1表的数据如下: > db.c1.find() { "_id" : ObjectId("4fb4af85afa87dc1bed94330"), "age" : 7, &qu

hdu 4291 A Short problem(矩阵+取模循环节)

A Short problem                                                          Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1785    Accepted Submission(s): 651 Problem Description According to a r

POJ 1845-Sumdiv(快速幂取模+整数唯一分解定理+约数和公式+同余模公式)

Sumdiv Time Limit:1000MS     Memory Limit:30000KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 1845 Appoint description:  System Crawler  (2015-05-27) Description Consider two natural numbers A and B. Let S be the sum of all natural d

1046 A^B Mod C(快速幂取模)

1046 A^B Mod C(51NOD基础题) 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 给出3个正整数A B C,求A^B Mod C. 例如,3 5 8,3^5 Mod 8 = 3. Input 3个正整数A B C,中间用空格分隔.(1 <= A,B,C <= 10^9) Output 输出计算结果 Input示例 3 5 8 Output示例 3 /* 1046 A^B Mod C(快速幂取模) 给出3个正整数A B C,求A^B Mod C. (