POJ 1845 Sumdiv 【逆元】
题意:求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 【逆元】相关推荐
- poj 1845 Sumdiv (算数基本定理+逆元)
输入a和b,求a^b的所有因子之和. #include <iostream> #define ll long longusing namespace std;const int mod=9 ...
- c语言的幂乘积表达式,POJ 1845 Sumdiv [素数分解 快速幂取模 二分求和等比数列]
大致题意: 求A^B的所有约数(即因子)之和,并对其取模 9901再输出. 解题基础: 1) 整数的唯一分解定理: 任意正整数都有且只有一种方式写出其素因子的乘积表达式. ,其中 为素数 2) 约数和 ...
- Linux等比数列脚本求和,POJ 1845 (约数和+二分等比数列求和)
题目大意:A^B的所有约数和,mod 9901. 解题思路: ①整数唯一分解定理: 一个整数A一定能被分成:A=(P1^K1)*(P2^K2)*(P3^K3).....*(Pn^Kn)的形式.其中Pn ...
- Sumdiv POJ - 1845
Sumdiv POJ - 1845 题意: 求ABA^BAB的所有约数之和mod 9901(1<=A,B<=5e7) 题解: 我们先将A分解质因子,表示为:p1c1∗p2c2∗...... ...
- 【简●解】POJ 1845 【Sumdiv】
POJ 1845 [Sumdiv] [题目大意] 给定\(A\)和\(B\),求\(A^B\)的所有约数之和,对\(9901\)取模. (对于全部数据,\(0<= A <= B <= ...
- 【POJ 1845】 Sumdiv (整数唯分+约数和公式+二分等比数列前n项和+同余)
[POJ 1845] Sumdiv 用的东西挺全 最主要通过这个题学了约数和公式跟二分求等比数列前n项和 另一种小优化的整数拆分 整数的唯一分解定理: 随意正整数都有且仅仅有一种方式写出其素因子的乘 ...
- POJ 1845 逆元 / 分治
题意 传送门 POJ 1845 题解 分解质因数 A=p1e1p2e2-pnenA=p_1^{e_1}p_2^{e_2}\dots p_n^{e_n}A=p1e1p2e2-pnen,则约数 ...
- POJ 1845 【数论】
题目链接:POJ 1845 题意 求ababa^b的所有约数之和,最终结果对9901求模 需要知识 1.快速幂:二分法求nmnmn^m的结果 2.因数分解:遍历求出所有因数 3.约数和定理:假设n=p ...
- POJ-1845 Sumdiv 逆元,特殊情况
详见代码: #include <cstdlib> #include <cstring> #include <cstdio> #include <cmath&g ...
最新文章
- java 抽象方法 虚方法的区别_声明抽象类(纯虚方法)会大幅增加二进制大小
- 33篇顶会论文如何做到?北大施柏鑫:论文投稿到接收,不可不知的关键环节...
- Transformer落地:使用话语重写器改进多轮人机对话
- Day11多态部分-2 【1.2 多态的前提】
- python向mysql中添加数据_通过python操控MYSQL添加数据,并将数据添加到EXCEL中-阿里云开发者社区...
- 代理模式中的静态代理
- HFun.快速开发平台(一)=》简述
- [国家集训队]middle(二分+主席树[中位数思维题])
- iOS使用自定义字体(添加字体包)
- oracle中的视图详解
- 开源新手必看7个小技巧
- 百万 Android 用户受感染!
- 获取触发事件的元素的ID
- POJ 1125 Stockbroker Grapevine
- java 生成ai矢量图_AI利用自己的工具将位图转换为矢量图
- Python爬取当当网图书数据
- oracle 列名sql,SQL查询表名、列名、列属性-Oracle
- 使用Python(OCR)收集体温打卡截图,并自动发消息提醒没交的人。
- 微信公众号整套逻辑的支付和退款
- 2023计算机毕业设计SSM最新选题之java儿童成长记录与分享系统cc35g
热门文章
- promise 为什么出现
- SQL数据表层面操作(DDL)
- qt的qprinter打印功能怎么设置打印时字体大小_如何打印一份成绩单
- Kubernetes入门培训(内含PPT)-(转)
- AIX操作系统版本小知识(转载)
- Java基础学习总结(172)——手写Java 重试机制
- JavaScript学习总结(12)——2016 年 7 个顶级 JavaScript 框架
- mysql创建数据表代码_MYSQL 简单的建库操作代码
- R循环有两个_R语言数据分析与挖掘(第九章):聚类分析(2)——层次聚类
- 20051129: NetBeans