题目链接:Sumdiv

题意:给定两个自然数A,B,定义S为A^B所有的自然因子的和,求出S mod 9901的值。

题解:了解下以下知识点
 
1.整数的唯一分解定理

任意正整数都有且只有唯一的方式写出其质因子的乘积表达式

$A={p_1}^{k_1}*{p_2}^{k_2}*{p_3}^{k_3}*...*{p_n}^{k_n}$

2.整数因数个数

$B=(k_1+1)*(k_2+1)*(k_3+1)...*(k_n+1)$

3.整数因数总和

$S=(1+p_1+p_1^2+p_1^3+...+{p_1}^{k_1})*(1+p_2+p_2^2+p_2^3+...+{p_2}^{k_2})*...(1+p_n+p_n^2+p_n^3+...+{p_n}^{k_n})$

明显地:先分解整数A,A的整数因数总和能表示,A^B只不过是pi变成pi^B。

通过等比数列求和公式:$\dfrac{{p_1}^{k_1b+1}-1}{p_1-1}=1+p_1+p_1^2+p_1^3+...+{p_1}^{k_1b}$

费马小定理:

$a^{p-1} ≡1 (mod p)$

两边同除以a

$a^{p-2} ≡inv(a) (mod p)$

$inv(a) = a^{p-2} (mod p)$

快速幂求一下即可:

 ll fast_mod(ll x,ll y,ll mod){
ll res=;
while(y){
if(y&) res=fast_mul(res,x,mod);
x=fast_mul(x,x,mod);
y>>=;
}
return res;
}

直接使用快速幂可能爆long long,结合快速乘防止爆long long:

 ll fast_mul(ll x,ll y,ll mod){
ll res=;
while(y){
if(y&) res=(res+x)%mod;
x=(x+x)%mod;
y>>=;
}
return res;
}

最后一个问题,存在逆元的情况是$ax ≡1(mod p)$

如果a是p的倍数时候左边为0,明显不等于右边。可以使用这个公式

$ans=\dfrac{a}{b}modm=amod(mb)/b$

 #include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std; typedef long long ll;
const int N=1e7;
const ll MOD=;
ll p[N],k[N];
ll a,b,c=; ll fast_mul(ll x,ll y,ll mod){
ll res=;
while(y){
if(y&) res=(res+x)%mod;
x=(x+x)%mod;
y>>=;
}
return res;
} ll fast_mod(ll x,ll y,ll mod){
ll res=;
while(y){
if(y&) res=fast_mul(res,x,mod);
x=fast_mul(x,x,mod);
y>>=;
}
return res;
} void solve(){
ll res=;
for(ll i=;i<c;i++){
ll M=MOD*(p[i]-);
res=res*(fast_mod(p[i],k[i]*b+,M)+M-)/(p[i]-)%MOD;
}
printf("%lld\n",(res+MOD)%MOD);
} int main(){
while(scanf("%lld%lld",&a,&b)!=EOF){
c=;
for(ll i=;i*i<=a;i++){
if(a%i==){
ll cnt=;
p[c]=i;
while(a%i==) a/=i,cnt++;
k[c]=cnt;
c++;
}
}
if(a>) {p[c]=a;k[c]=;c++;}
solve();
}
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 (等比求和+逆元)

    题目链接:http://poj.org/problem?id=1845 题目大意:给出两个自然数a,b,求a^b的所有自然数因子的和模上9901 (0 <= a,b <= 50000000 ...

  4. POJ 1845 Sumdiv 【逆元】

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

  5. Sumdiv POJ - 1845 (逆元/分治)

    Consider two natural numbers A and B. Let S be the sum of all natural divisors of A^B. Determine S m ...

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

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

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

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

  8. POJ 1845 Sumdiv (数学,乘法逆元)

    题意: 给出数字A和B,要求AB的所有因子(包括AB和1)之和 mod 9901 的结果. 思路: 即使知道公式也得推算一阵子. 很容易知道,先把分解得到,那么得到,那么的所有因子之和的表达式如下: ...

  9. poj 1845 Sumdiv 约数和定理

    Sumdiv 题目连接: http://poj.org/problem?id=1845 Description Consider two natural numbers A and B. Let S ...

随机推荐

  1. nmon for Linux & Java

    nmon for Linux | Main / HomePagehttp://nmon.sourceforge.net/pmwiki.php Java Nmon Analyser download | ...

  2. 【Python3练习题 013】 求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字

    a=input('输入数字>>>') count=int(input('几个数字相加>>>')) ret=[] for i in range(1,count+1): ...

  3. Chrome浏览器的版本查看 以及V8 javascript 引擎版本查看

    1. 发现chrome浏览器最新版本里面带的V8 引擎 版本号与chrome的版本号有一个关系, 这里简单总结一下: 在地址栏里面输入: chrome://version 即可显示出来 比如我正在使用 ...

  4. ZJU_1145 OR POJ_1100 Dreisam Equations

    Dreisam Equations { 两个网站的题有点不一样(ZJH有特判)POJ时间卡得紧,建议去POJ过 } 题目大意: 给你一个字符串:是一个等式,等式左边是一个数,右边由若干个数和()构成, ...

  5. Django--CRM--modelformset的用法

    一 . modelformset用法 其实和modelform方法差不多,只不过是显示的时候可以直接修改,显示的select的那种模式 from django.forms import modelfo ...

  6. python之路--内置函数, 匿名函数

    一 . 内置函数 什么是内置函数? 就是python给你提供的. 拿来直接⽤的函数, 比如print., input等等. 字符串类型代码的执⾏ eval() 执⾏字符串类型的代码. 并返回最终结果( ...

  7. python 钉钉机器人发送消息

    import json import requests def sendmessage(message): url = 'https://oapi.dingtalk.com/robot/send?ac ...

  8. hive 查询注意问题

    1)对于hive内置的列,不是自己建的,在查询的时候需要添加反引号` 比如:`_mt_message`,别在这里犯错误, (2)南京的_mt_message是json的格式,所以可以直接使用:get_ ...

  9. java & jdk

    java & jdk JDK 下载太慢 & java 12 https://download.oracle.com/otn-pub/java/jdk/12.0.1+12/69cfe15 ...

  10. 莫烦theano学习自修第一天【常量和矩阵的运算】

    1. 代码实现如下: #!/usr/bin/env python #! _*_ coding:UTF-8 _*_ # 导入numpy模块,因为numpy是常用的计算模块 import numpy as ...