POJ 1845 Sumdiv (整数唯一分解定理)

时间:2021-12-02 00:53:13

题目链接

Sumdiv
Time Limit: 1000MS   Memory Limit: 30000K
Total Submissions: 25841   Accepted: 6382

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). 

题意:

求A^B的约数和。

题解:

(1)整数唯一分解定理:

任意一个整数都可以写成素数相乘的形式

A=(p1^k1)*(p2^k2)*(p3^k3)*....*(pn^kn)   其中pi均为素数

(2)约数:

S = (1+p1+p1^2+p1^3+...p1^k1) * (1+p2+p2^2+p2^3+….p2^k2) * (1+p3+ p3^3+…+ p3^k3) * .... * (1+pn+pn^2+pn^3+...pn^kn);

(3)逆元:

a/b%mod = (a%b*mod)/b;

 (4) 快速幂。

有了以上基础,最终:

A^B的所有约数之和为:

sum = [1+p1+p1^2+...+p1^(a1*B)] * [1+p2+p2^2+...+p2^(a2*B)] *...* [1+pn+pn^2+...+pn^(an*B)].

代码:

#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
#include <queue>
#include <map>
#include <list>
#include <utility>
#include <set>
#include <algorithm>
#include <deque>
#include <vector>
#define mem(arr,num) memset(arr,0,sizeof(arr))
#define _for(i, a, b) for(int i = a; i <= b; i++)
#define __for(i, a, b) for(int i = a; i >=b; i--)
#define IO ios::sync_with_stdio(false);\
        cin.tie();\
        cout.tie();
using namespace std;
typedef long long ll;
typedef vector<int > vi;
const ll INF = 0x3f3f3f3f;
;
+ ;
bool vis[N];
int prime[N],num;
void getprime() {
    _for(i, , N){
        if(!vis[i]) prime[++num] = i;
        ; j <= num && i * prime[j] <= N; j++){
            vis[i * prime[j]] = true;
            ) break;
        }
    }
}
/*
ll quick_pow(ll a, ll b, ll m) {
    ll ret = 1;
    a %= m;
    while(b) {
        if(b & 1) ret = (ret * a) % m;
        b >>= 1;
        a = (a * a) % m;
    }
    return ret;
}
有可能爆long long;
*/
ll quick_pow1(ll a, ll b, ll m){
    ll ret = ;
    a %= m;
    while(b) {
        ) ret = (ret + a) % m;
        b >>= ;
        a = (a + a) % m;
    }
    return ret;
}
ll quick_pow(ll a, ll b, ll m){
    ll ret = ;
    while(b) {
        ) ret = quick_pow1(ret,a,m);
        a = quick_pow1(a,a,m);
        b >>= ;
    }
    return ret;
}
int main() {
    ll A, B, ans = ;
    getprime();
    cin >> A >> B;
    ; prime[i] * prime[i] <= A; i++){
        ;
        ){
            ){
            cnt++;
            A /= prime[i];
        }
            // a/b%c = (a%b*c/b)
            ll M = (prime[i] - ) * mod;
            ans *= (quick_pow(prime[i], cnt * B +, M) + M - )/(prime[i] - );
            ans %= mod;
        }
    }
    ){
            ll M = (A - ) * mod;
            ans *= (quick_pow(A, B +, M) + M - )/(A - );
            ans %= mod;
        }
    cout << ans << endl;
    ;
}

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&lpar;快速幂取模&plus;整数唯一分解定理&plus;约数和公式&plus;同余模公式&rpar;

    Sumdiv Time Limit:1000MS     Memory Limit:30000KB     64bit IO Format:%I64d & %I64u Submit Statu ...

  3. POJ 1845 Sumdiv &lbrack;素数分解 快速幂取模 二分求和等比数列&rsqb;

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

  4. POJ 1845 Sumdiv(逆元)

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

  5. poj 1845 Sumdiv &lpar;等比求和&plus;逆元&rpar;

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

  6. poj 1845 Sumdiv &lpar;数论&rpar;

    题目链接 题意:求 A^B的所有约数之和对9901取模后的结果. 分析: 看了小优的博客写的. 分析来自 http://blog.csdn.net/lyy289065406/article/detai ...

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

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

  8. POJ 1845 Sumdiv (整数拆分&plus;等比快速求和)

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

  9. poj 1845 Sumdiv 约数和定理

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

随机推荐

  1. su:认证失败

    使用命令[su - root]切换用户,提示[su:认证失败] 原因:Ubuntu安装之后,root用户默认是被锁定的,不允许登录,也不允许su到root. 解决:重新设置密码 在终端输入命令:sud ...

  2. 详解Spring中的CharacterEncodingFilter--forceEncoding为true在java代码中设置失效--html设置编码无效

    在项目中有很多让人头疼的问题,其中,编码问题位列其一,那么在Spring框架中是如何解决从页面传来的字符串的编码问题的呢?下面我们来看看Spring框架给我们提供过滤器CharacterEncodin ...

  3. yaml在python中的应用简单整理

    #简单介绍============================================================== YAML使用寄主语言的数据类型,这在多种语言中流传的时候可能会引 ...

  4. RED&lowbar;HAWK:基于PHP实现的信息收集与SQL注入漏洞扫描工具

    无事早上就去逛freebuf看到一款不错的工具,打算介绍给大家 RED_HAWK:基于PHP实现的信息收集与SQL注入漏洞扫描工具 RED HAWK 最新版本:v1.0.0[2017年6月11日] 下 ...

  5. python 字符串与16进制 转化

    def str_to_hex(s): return r"/x"+r'/x'.join([hex(ord(c)).replace('0x', '') for c in s]) def ...

  6. Linux下计算进程的CPU占用和内存占用的编程方法&lbrack;转&rsqb;

    from:https://www.cnblogs.com/cxjchen/archive/2013/03/30/2990548.html Linux下没有直接可以调用系统函数知道CPU占用和内存占用. ...

  7. ADO&period;Net 数据库 删除

    删除数据库里的信息和之前增加,修改大同小异,其写法更加简单,也是把SQL语句写为删除语句 删除一条数据,只需要获取并接收到这条数据唯一的能够代表这条数据的信息,比如主键 代码演示: using Sys ...

  8. Java中的日志管理

    日志是应用程序运行中不可缺少的一部分,JAVA中有很多已经成熟的方案,尽管记录日志是应用开发中并不可少的功能,在 JDK 的最初版本中并不包含日志记录相关的 API 和实现.相关的 API(java. ...

  9. DCGAN in Tensorflow生成动漫人物

    引自:GAN学习指南:从原理入门到制作生成Demo 生成式对抗网络(GAN)是近年来大热的深度学习模型.最近正好有空看了这方面的一些论文,跑了一个GAN的代码,于是写了这篇文章来介绍一下GAN. 本文 ...

  10. &lbrack;Lua&rsqb; try catch实现

    参考了https://blog.csdn.net/waruqi/article/details/53649634这里的代码,但实际使用时还有些问题,修改后在此记录一下. -- 异常捕获 functio ...