题目链接:http://poj.org/problem?id=1845

题目大意:给出两个自然数a,b,求a^b的所有自然数因子的和模上9901 (0 <= a,b <= 50000000)

解题思路:我们先利用唯一分解定理,将a分解成(p1^q1)*(p2^q2)……(pk^qk)的形式,则a^b=((p1^q1)*(p2^q2)……(pk^qk))^b=(p1^q1b)*(p2^q2b)……(pk^qkb)

a^b的因子和就会等于(1+p1+p1^2+……p1^q1b)*(1+p2+p2^2+……p2^q2b)*……(1+pk+pk^2+……pk^qkb)

然后我们可以用等差求和公式转化为((p1^(q1b+1)-1)/(p1-1))*((p2^(q2b+1)-1)/(p2-1))……((pk^(qkb+1)-1)/(pk-1))

对于求逆元:

(a/b)%mod=(a%(mod*b))/b%mod。对B*mod取余,剩余的值必定是B的倍数,这种方法是用于mod和B小的时候,用在这题就刚好了。

#include<iostream>
using namespace std;
typedef long long ll;
const int MAXN=;
const int mod=;
ll a,b,prime[MAXN],tot;
void getPrime(int N){ //筛素数
for(int i=;i<=N;i++) prime[i]=;
for(int i=;i<=N;i++){
if(prime[i])
prime[tot++]=i;
for(int j=;j<tot&&prime[j]*i<=N;j++){
prime[i*prime[j]]=;
if(i%prime[j]==)break;
}
}
}
ll qmul(ll a,ll b,ll m){
ll res=;
while(b){
if(b&) res=(res+a)%m;
b>>=;
a=(a+a)%m;
}
return res;
}
ll qpow(ll a,ll b,ll m){
ll res=;
while(b){
if(b&) res=qmul(res,a,m); //直接相乘会爆,可以一个一个加
a=qmul(a,a,m);
b>>=;
}
return res;
}
ll solve(ll x,ll y){
ll ans=;
for(int i=;prime[i]*prime[i]<=x;i++){
if(x%prime[i]==){
int cnt=;
while(x%prime[i]==){
cnt++;
x/=prime[i];
}
ll M=(prime[i]-)*mod;
ans=ans*(qpow(prime[i],cnt*y+,M)-+M)%M/(prime[i]-)%mod;
}
}
if(x>){
ll M=(x-)*mod;
ans=ans*(qpow(x,y+,M)-+M)%M/(x-)%mod;
}
return ans;
}
int main(){
cin>>a>>b;
getPrime();
cout<<solve(a,b)<<endl;
return ;
}

poj 1845 Sumdiv (等比求和+逆元)的更多相关文章

  1. poj 1845 POJ 1845 Sumdiv 数学模板

    筛选法+求一个整数的分解+快速模幂运算+递归求计算1+p+p^2+````+p^nPOJ 1845 Sumdiv求A^B的所有约数之和%9901 */#include<stdio.h>#i ...

  2. POJ 1845 Sumdiv 【二分 || 逆元】

    任意门:http://poj.org/problem?id=1845. Sumdiv Time Limit: 1000MS Memory Limit: 30000K Total Submissions ...

  3. POJ 1845 Sumdiv(逆元)

    题目链接:Sumdiv 题意:给定两个自然数A,B,定义S为A^B所有的自然因子的和,求出S mod 9901的值. 题解:了解下以下知识点   1.整数的唯一分解定理 任意正整数都有且只有唯一的方式 ...

  4. POJ 1845 Sumdiv [素数分解 快速幂取模 二分求和等比数列]

    传送门:http://poj.org/problem?id=1845 大致题意: 求A^B的所有约数(即因子)之和,并对其取模 9901再输出. 解题基础: 1) 整数的唯一分解定理: 任意正整数都有 ...

  5. POJ 1845 Sumdiv 【逆元】

    题意:求A^B的所有因子之和 很容易知道,先把分解得到,那么得到,那么 的所有因子和的表达式如下 第一种做法是分治求等比数列的和  用递归二分求等比数列1+pi+pi^2+pi^3+...+pi^n: ...

  6. POJ 1845 Sumdiv(因子分解+快速幂+二分求和)

    题意:给你A,B,让求A^B所有的因子和模上9901 思路:A可以拆成素因子的乘积: A = p1^x1 * p2^x2 *...* pn^xn 那么A^B = p1^(B*x1) * p2^(B*x ...

  7. POJ 1845 Sumdiv (整数拆分+等比快速求和)

    当我们拆分完数据以后, A^B的所有约数之和为: sum = [1+p1+p1^2+...+p1^(a1*B)] * [1+p2+p2^2+...+p2^(a2*B)] *...*[1+pn+pn^2 ...

  8. POJ 1845 Sumdiv(求因数和 + 逆元)题解

    题意:给你a,b,要求给出a^b的因子和取模9901的结果. 思路:求因子和的方法:任意A = p1^a1 * p2^a2 ....pn^an,则因子和为sum =(1 + p1 + p1^2 + . ...

  9. poj 1845 Sumdiv(约数和,乘法逆元)

    题目: 求AB的正约数之和. 输入: A,B(0<=A,B<=5*107) 输出: 一个整数,AB的正约数之和 mod 9901. 思路: 根据正整数唯一分解定理,若一个正整数表示为:A= ...

随机推荐

  1. zabbix邮件报警通过脚本来发送邮件

    zabbix默认邮件报警会将各个报警接收人单独发送邮件,为了使邮件能以群发的方式统一一封邮件发送所有接收人,需要改成脚本的形式: sendemail.py: #!/usr/bin/python imp ...

  2. 01 安装IDEA

    https://www.jetbrains.com 1 . 2

  3. IT 技术人需要思考的 15 个问题

    行内的人自嘲是程序猿.屌丝和码农,行外的人也经常拿IT人调侃,那么究竟是IT人没有价值,还是没有仔细思考过自身的价值? 1.搞 IT 的是屌丝.码农.程序猿? 人们提到IT人的时候,总会想到他们呆板. ...

  4. div页面布局基本布局知识

    页面代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...

  5. Favorite Donut

    Favorite Donut Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) ...

  6. (转)CoreDNS介绍

    转:https://www.colabug.com/4171614.html 本文介绍 CoreDNS 相关配置以及验证方法,实验环境为 Kubernetes 1.11,搭建方法参考 kubeadm安 ...

  7. centos mysql初探 -- 配置、基本操作及问题

    目录: centos安装mysql 使用mysql客户端进行简单操作 python2和python3连接mysql mysql导入文件问题 死锁解决办法 windows 7 远程连接 mysql 服务 ...

  8. CDN:目录

    ylbtech-CDN:目录 1. 前端开源项目返回顶部 1. http://www.bootcdn.cn/ 2. https://www.npmjs.com/ 3. 2.返回顶部   3.返回顶部 ...

  9. vue对组件以数组方式赋值的问题

    当从后台直接调接口返回数据 直接将数组array赋值给定义的变量,会导致组件无法更改其它值,例如多选框,多选下拉框,会导致无法选中其它的值,也无法取消当前已赋值的选中项 data() { return ...

  10. day02-Javascript之document.write()方法

    转行学开发,代码100天.——2018-03-18 document.write()方法作为Javascript的常用输出方式,可输出字符串,标签元素,变量等. document.write(&quo ...