题意:求A^B的所有因子之和

很容易知道,先把分解得到,那么得到,那么

的所有因子和的表达式如下

第一种做法是分治求等比数列的和

 用递归二分求等比数列1+pi+pi^2+pi^3+...+pi^n:

(1)若n为奇数,一共有偶数项,则:
      1 + p + p^2 + p^3 +...+ p^n

= (1+p^(n/2+1)) + p * (1+p^(n/2+1)) +...+ p^(n/2) * (1+p^(n/2+1))
      = (1 + p + p^2 +...+ p^(n/2)) * (1 + p^(n/2+1))

(2)若n为偶数,一共有奇数项,则:
      1 + p + p^2 + p^3 +...+ p^n

= (1+p^(n/2+1)) + p * (1+p^(n/2+1)) +...+ p^(n/2-1) * (1+p^(n/2+1)) + p^(n/2)
      = (1 + p + p^2 +...+ p^(n/2-1)) * (1+p^(n/2+1)) + p^(n/2);

其他用到的知识是素数筛选以及快速幂,本博客都有相应知识或者百度也行

#include<stdio.h>
#include<string.h>
typedef long long ll;
const int mod=9901;
const int N=1e5+11;
int p[N],pr[N],cnt;
void init(){for(int i=2;i<N;i++){if(!p[i])    pr[++cnt]=i;for(int j=1;j<=cnt&&i*pr[j]<N;j++){p[i*pr[j]]=1;if(i%pr[j]==0)    break;}}
}
ll pow_m(ll a,ll b,ll m){ll ans=1;a%=m;while(b){if(b&1)ans=(ans*a)%m;a=(a*a)%m;b>>=1;}return ans;
}
ll sum(ll p,ll n){if(!n)    return 1;if(n&1){return (sum(p,n/2)*(1+pow_m(p,n/2+1,mod)))%mod;}else{return (sum(p,n/2-1)*(1+pow_m(p,n/2+1,mod))+pow_m(p,n/2,mod))%mod;}
}
int main(){ll a,b;init();while(~scanf("%lld%lld",&a,&b)){ll ans=1;for(int i=1;i<=cnt&&pr[i]*pr[i]<=a;i++){if(a%pr[i]==0){int num=0;while(a%pr[i]==0){num++;a/=pr[i];}ans=(ans*sum(pr[i],num*b))%mod;}}if(a>1){ans=(ans*sum(a,b))%mod;}printf("%lld\n",ans);}return 0;
}

第二种方法就是用等比数列求和公式,但是要用逆元。用如下公式即可(已知a|b)

我们来证明它,已知,证明步骤如下

在快速幂时的乘法会爆longlong,所以用快速乘

#include<stdio.h>
#include<string.h>
typedef long long ll;
const int mod=9901;
const int N=1e5+11;
int p[N],pr[N],cnt;
void init(){for(int i=2;i<N;i++){if(!p[i])    pr[++cnt]=i;for(int j=1;j<=cnt&&i*pr[j]<N;j++){p[i*pr[j]]=1;if(i%pr[j]==0)    break;}}
}
ll mul(ll a,ll b,ll m){ll ans=0;a%=m;while(b){if(b&1)ans=(ans+a)%m;a=(a+a)%m;b>>=1;}return ans;
}
ll pow_m(ll a,ll b,ll m){ll ans=1;a%=m;while(b){if(b&1)ans=mul(ans,a,m);a=mul(a,a,m);b>>=1;}return ans;
}
int main(){ll a,b;init();while(~scanf("%lld%lld",&a,&b)){ll ans=1;for(int i=1;i<=cnt&&pr[i]*pr[i]<=a;i++){if(a%pr[i]==0){int num=0;while(a%pr[i]==0){num++;a/=pr[i];}ll M=(pr[i]-1)*mod;ans*=(pow_m(pr[i],num*b+1,M)+M-1)/(pr[i]-1);ans%=mod;}}if(a>1){ll M=(a-1)*mod;ans*=(pow_m(a,b+1,M)+M-1)/(a-1);ans%=mod;}printf("%lld\n",ans);}return 0;
}

http://blog.csdn.net/lyy289065406/article/details/6648539

http://blog.csdn.net/acdreamers/article/details/8220787

转载于:https://www.cnblogs.com/L-King/p/5723108.html

POJ 1845 Sumdiv 【逆元】相关推荐

  1. poj 1845 Sumdiv (算数基本定理+逆元)

    输入a和b,求a^b的所有因子之和. #include <iostream> #define ll long longusing namespace std;const int mod=9 ...

  2. c语言的幂乘积表达式,POJ 1845 Sumdiv [素数分解 快速幂取模 二分求和等比数列]

    大致题意: 求A^B的所有约数(即因子)之和,并对其取模 9901再输出. 解题基础: 1) 整数的唯一分解定理: 任意正整数都有且只有一种方式写出其素因子的乘积表达式. ,其中 为素数 2) 约数和 ...

  3. Linux等比数列脚本求和,POJ 1845 (约数和+二分等比数列求和)

    题目大意:A^B的所有约数和,mod 9901. 解题思路: ①整数唯一分解定理: 一个整数A一定能被分成:A=(P1^K1)*(P2^K2)*(P3^K3).....*(Pn^Kn)的形式.其中Pn ...

  4. Sumdiv POJ - 1845

    Sumdiv POJ - 1845 题意: 求ABA^BAB的所有约数之和mod 9901(1<=A,B<=5e7) 题解: 我们先将A分解质因子,表示为:p1c1∗p2c2∗...... ...

  5. 【简●解】POJ 1845 【Sumdiv】

    POJ 1845 [Sumdiv] [题目大意] 给定\(A\)和\(B\),求\(A^B\)的所有约数之和,对\(9901\)取模. (对于全部数据,\(0<= A <= B <= ...

  6. 【POJ 1845】 Sumdiv (整数唯分+约数和公式+二分等比数列前n项和+同余)

    [POJ 1845] Sumdiv 用的东西挺全 最主要通过这个题学了约数和公式跟二分求等比数列前n项和 另一种小优化的整数拆分  整数的唯一分解定理: 随意正整数都有且仅仅有一种方式写出其素因子的乘 ...

  7. POJ 1845 逆元 / 分治

    题意 传送门 POJ 1845 题解 分解质因数 A=p1e1p2e2-pnenA=p_1^{e_1}p_2^{e_2}\dots p_n^{e_n}A=p1e1​​p2e2​​-pnen​​,则约数 ...

  8. POJ 1845 【数论】

    题目链接:POJ 1845 题意 求ababa^b的所有约数之和,最终结果对9901求模 需要知识 1.快速幂:二分法求nmnmn^m的结果 2.因数分解:遍历求出所有因数 3.约数和定理:假设n=p ...

  9. POJ-1845 Sumdiv 逆元,特殊情况

    详见代码: #include <cstdlib> #include <cstring> #include <cstdio> #include <cmath&g ...

最新文章

  1. java 抽象方法 虚方法的区别_声明抽象类(纯虚方法)会大幅增加二进制大小
  2. 33篇顶会论文如何做到?北大施柏鑫:论文投稿到接收,不可不知的关键环节...
  3. Transformer落地:使用话语重写器改进多轮人机对话
  4. Day11多态部分-2 【1.2 多态的前提】
  5. python向mysql中添加数据_通过python操控MYSQL添加数据,并将数据添加到EXCEL中-阿里云开发者社区...
  6. 代理模式中的静态代理
  7. HFun.快速开发平台(一)=》简述
  8. [国家集训队]middle(二分+主席树[中位数思维题])
  9. iOS使用自定义字体(添加字体包)
  10. oracle中的视图详解
  11. 开源新手必看7个小技巧
  12. 百万 Android 用户受感染!
  13. 获取触发事件的元素的ID
  14. POJ 1125 Stockbroker Grapevine
  15. java 生成ai矢量图_AI利用自己的工具将位图转换为矢量图
  16. Python爬取当当网图书数据
  17. oracle 列名sql,SQL查询表名、列名、列属性-Oracle
  18. 使用Python(OCR)收集体温打卡截图,并自动发消息提醒没交的人。
  19. 微信公众号整套逻辑的支付和退款
  20. 2023计算机毕业设计SSM最新选题之java儿童成长记录与分享系统cc35g

热门文章

  1. promise 为什么出现
  2. SQL数据表层面操作(DDL)
  3. qt的qprinter打印功能怎么设置打印时字体大小_如何打印一份成绩单
  4. Kubernetes入门培训(内含PPT)-(转)
  5. AIX操作系统版本小知识(转载)
  6. Java基础学习总结(172)——手写Java 重试机制
  7. JavaScript学习总结(12)——2016 年 7 个顶级 JavaScript 框架
  8. mysql创建数据表代码_MYSQL 简单的建库操作代码
  9. R循环有两个_R语言数据分析与挖掘(第九章):聚类分析(2)——层次聚类
  10. 20051129: NetBeans