题目传送门

Sumdiv

Time Limit: 1000MS   Memory Limit: 30000K
Total Submissions: 26041   Accepted: 6430

Description

Consider two natural numbers A and B. Let S be the sum of all natural divisors of A^B. Determine S modulo 9901 (the rest of the division of S by 9901).

Input

The only line contains the two natural numbers A and B, (0 <= A,B <= 50000000)separated by blanks.

Output

The only line of the output will contain S modulo 9901.

Sample Input

2 3

Sample Output

15

Hint

2^3 = 8. 
The natural divisors of 8 are: 1,2,4,8. Their sum is 15. 
15 modulo 9901 is 15 (that should be output). 

Source


  分析:

  题意就是求A^B在mod 9901下的约数和。

  之前遇到过一个一模一样的题,直接分解质因数,把每一个质因数按照费马小定理对9901-1取模然后直接暴力计算就过了,但是在这里死活过不了。然后稍微推了一下发现这么做有BUG,因为9900不是质数,取模的时候会出错。

  然后翻了一下lyd的书,正解思路了解一下。

  同样先分解质因数,再由约数和定理ans=(1+q1+q1^2+...+q1^(c1*b))*(1+q2+q2^2+...+q2^(c2*b))*...*(1+qn+qn^2+...qn^(cn*b))可得,对于每一个质因数qi,求(1+qi+qi^2+...+qi^(ci*b))时,可以用等比数列的求和公式求,即(qi^(b*ci+1))/(qi-1),但是除法并不满足取模的分配律,所以就用逆元来代替。也就是求1/(qi-1)在模9901下的逆元。但是要注意,qi-1可能被9901整除,此时不存在逆元。不过可以发现,此时qi mod 9901=1,那么(1+qi+qi^2+...+qi^(b*ci))=1+1+1+...+1(b*ci+1个1),特判即可。

  Code:

//It is made by HolseLee on 21st June 2018
//POJ 1845
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<iomanip>
#include<algorithm>
using namespace std;
typedef long long ll;
const ll mod=;
const ll N=5e6+;
ll A,B,q[N],f[N],ans,tot,cnt;
void fenjie()
{
for(ll i=;i*i<=A;i++){
if(A%i==){
q[++cnt]=i;
while(A%i==){
f[cnt]++;A/=i;}
}
}
if(A>)q[++cnt]=A,f[cnt]++;
}
inline ll power(ll x,ll y)
{
ll ret=;
while(y>){
if(y&)ret=(ret*x)%mod;
x=(x*x)%mod;y>>=;}
return ret;
}
void work()
{
fenjie();ans=;
for(int i=;i<=cnt;i++){
if((q[i]-)%mod==){
ans=(ans*(B*f[i]+)%mod)%mod;
continue;}
ll x=power(q[i],B*f[i]+);
x=(x-+mod)%mod;
ll y=power(q[i]-,mod-);
ans=(ans*x*y)%mod;
}
printf("%lld",ans);
}
int main()
{
cin>>A>>B;
work();return ;
}

POJ1845 Sumdiv [数论,逆元]的更多相关文章

  1. POJ1845 sumdiv 数论

    正解:小学数学数论 解题报告: 传送门! 其实不难但我数学这个方面太菜了所以还是多写点儿博客趴QAQ 然后因为是英文的所以先翻译一下,,,? 大概就是说求AB的所有约数之和,对9901取膜 这个只需要 ...

  2. 题解 poj1845 Sumdiv (数论) (分治)

    传送门 大意:求A^B的所有因子之和,并对其取模 9901再输出 (这题又调了半天,把n和项数弄混了QAQ) 根据算数基本定理:A=(p1^k1)*(p2^k2)*(p3^k3)*...*(pn^kn ...

  3. poj1845 Sumdiv

    poj1845 Sumdiv 数学题 令人痛苦van分的数学题! 题意:求a^b的所有约数(包括1和它本身)之和%9901 这怎么做呀!!! 百度:约数和定理,会发现 p1^a1 * p2^a2 * ...

  4. 【题解】POJ1845 Sumdiv(乘法逆元+约数和)

    POJ1845:http://poj.org/problem?id=1845 思路: AB可以表示成多个质数的幂相乘的形式:AB=(a1n1)*(a2n2)* ...*(amnm) 根据算数基本定理可 ...

  5. POJ1845 Sumdiv 数学?逆元?

    当初写过一篇分治的 题意:求A^B的所有因子之和,并对其取模 9901再输出 对于数A=p1^c1+p2^c2+...+pn*cn,它的所有约数之和为(1+p1+p1^2+p1^3+...+p1^(c ...

  6. POJ 1845 Sumdiv(逆元)

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

  7. POJ 1845 Sumdiv 【逆元】

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

  8. poj1845 sumdiv (因数的和)

    首先分解质因数,$A^B=p_1^{m_1B}p_2^{m_2B}...p_n^{m_nB}$ 然后的话,它的所有因数的和就是$\prod{(1+p_i^1+p_i^2+...+p_i^n)}$ 用一 ...

  9. 约数之和(POJ1845 Sumdiv)

    最近应老延的要求再刷<算法进阶指南>(不得不说这本书不错)...这道题花费了较长时间~(当然也因为我太弱了)所以就写个比较易懂的题解啦~ 原题链接:POJ1845 翻译版题目(其实是AcW ...

随机推荐

  1. JavaScript知识之判断字符串中出现最多的字符及次数

    var str = 'asdddasdfdseeeeeweeeeeeeeeeeee'; var json = {}; // 定义json一个对象 for(var i = 0; i < str.l ...

  2. Eclipse srever起来时,时间超过45s。

    双击servere的名字,在属性界面上进行修改. 如下图: 修改TimeOut中的值即可.

  3. Java反射中method.isBridge() 桥接方法

    桥接方法是 JDK 1.5 引入泛型后,为了使Java的泛型方法生成的字节码和 1.5 版本前的字节码相兼容,由编译器自动生成的方法.我们可以通过Method.isBridge()方法来判断一个方法是 ...

  4. c# delegate知识

    一.引用方法 委托是寻址方法的.NET版本.委托是类型安全的类,它定义了返回类型和参数的类型.委托是对方法的引用,也可以对多个方法进行引用,委托可以理解为指向方法地址的指针. 如:delegate i ...

  5. 【Codeforces542E】Playing on Graph [Bfs][Dfs]

    Playing on Graph Time Limit: 20 Sec  Memory Limit: 512 MB Description Input Output Sample Input 5 4 ...

  6. bzoj 1452: [JSOI2009]Count ——二维树状数组

    escription Input Output Sample Input Sample Output 1 2 HINT ———————————————————————————————————————— ...

  7. c语言目录操作总结

    =================================================== char *getcwd( char *buffer, int maxlen ); (获取当前目 ...

  8. 大聊Python----IO口多路复用

    什么是IO 多路复用呢? 我一个SocketServer有500个链接连过来了,我想让500个链接都是并发的,每一个链接都需要操作IO,但是单线程下IO都是串行的,我实现多路的,看起来像是并发的效果, ...

  9. 安全测试===sqlmap

    本文转自:https://www.secpulse.com/archives/4213.html   鉴于很多新手对sqlmap的用法不是很熟悉 很多常用sqlmap的也不一定完全会用sqlmap 特 ...

  10. 判断cookie创建的时间是否已经24小时

    def read_cookie(self): cookiesfilepath="cookies%s" % self.uid if os.path.exists(cookiesfil ...