POJ 1845 Sumdiv(逆元)
题目链接:Sumdiv
题意:给定两个自然数A,B,定义S为A^B所有的自然因子的和,求出S mod 9901的值。
任意正整数都有且只有唯一的方式写出其质因子的乘积表达式
$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(逆元)的更多相关文章
- poj 1845 POJ 1845 Sumdiv 数学模板
筛选法+求一个整数的分解+快速模幂运算+递归求计算1+p+p^2+````+p^nPOJ 1845 Sumdiv求A^B的所有约数之和%9901 */#include<stdio.h>#i ...
- POJ 1845 Sumdiv 【二分 || 逆元】
任意门:http://poj.org/problem?id=1845. Sumdiv Time Limit: 1000MS Memory Limit: 30000K Total Submissions ...
- poj 1845 Sumdiv (等比求和+逆元)
题目链接:http://poj.org/problem?id=1845 题目大意:给出两个自然数a,b,求a^b的所有自然数因子的和模上9901 (0 <= a,b <= 50000000 ...
- POJ 1845 Sumdiv 【逆元】
题意:求A^B的所有因子之和 很容易知道,先把分解得到,那么得到,那么 的所有因子和的表达式如下 第一种做法是分治求等比数列的和 用递归二分求等比数列1+pi+pi^2+pi^3+...+pi^n: ...
- 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 ...
- POJ 1845 Sumdiv(求因数和 + 逆元)题解
题意:给你a,b,要求给出a^b的因子和取模9901的结果. 思路:求因子和的方法:任意A = p1^a1 * p2^a2 ....pn^an,则因子和为sum =(1 + p1 + p1^2 + . ...
- poj 1845 Sumdiv(约数和,乘法逆元)
题目: 求AB的正约数之和. 输入: A,B(0<=A,B<=5*107) 输出: 一个整数,AB的正约数之和 mod 9901. 思路: 根据正整数唯一分解定理,若一个正整数表示为:A= ...
- POJ 1845 Sumdiv (数学,乘法逆元)
题意: 给出数字A和B,要求AB的所有因子(包括AB和1)之和 mod 9901 的结果. 思路: 即使知道公式也得推算一阵子. 很容易知道,先把分解得到,那么得到,那么的所有因子之和的表达式如下: ...
- poj 1845 Sumdiv 约数和定理
Sumdiv 题目连接: http://poj.org/problem?id=1845 Description Consider two natural numbers A and B. Let S ...
随机推荐
- 如何使用 Docker 来限制 CPU、内存和 IO等资源?
如何使用 Docker 来限制 CPU.内存和 IO等资源?http://www.sohu.com/a/165506573_609513
- Druid Monitor开启登录界面
<!-- druid --> <filter> <filter-name>druidWebStatFilter</filter-name> <fi ...
- PHP PSR代码规范
转载: https://www.awaimai.com/916.html PSR是PHP通用性框架小组 (PHP Framework Interop Group) 制定的PHP代码编写格式规范,是PH ...
- CentOs7安装docker(第二篇)
一.Docker的概念: Docker: 镜像:Images 类似于面向对象中的类 容器:Container 类似于面向对象中的对象 它们之间的关系:容器Container通过镜像Images来创建 ...
- DLNA流媒体设置
- Netty ByteBuf和Nio ByteBuffer
参考https://blog.csdn.net/jeffleo/article/details/69230112 一.简介 Netty中引入了ByteBuf,它相对于ByteBuffer来说,带来了很 ...
- Spring JDBC模版以及三种数据库连接池的使用
jar包版本有点乱,直接忽略版本号,将就一下. 这里引了aop包是因为在spring3版本之后用模版对数据库库操作时会出现问题,但是不会报错,也没有提示. 所以这里直接引入,以及之后会用到的DBCP与 ...
- PHP金额工具类之将阿利伯数字转换为大写中文数字
1.将阿拉伯数字转换为中文大写数字 <?php namespace core\components; class PriceHelper extends \yii\base\Component{ ...
- RuntimeError: cryptography requires setuptools 18.5 or newer, please upgrade to a newer version of setuptool
setuptool 太老了,更新下: pip install --upgrade setuptools
- 使用proxychains 代理终端
最近在国外的vps上搭建了一个ss服务器,在浏览器里面设置socks5代理上网很方便, 但是终端里面却只支持http方式的代理配置,网上有socks转http代理的方式,但是最近发现一个更为简单的方式 ...