POJ1845Sumdiv(求所有因子和 + 唯一分解定理)

Sumdiv

Time Limit: 1000MS   Memory Limit: 30000K
Total Submissions: 17387   Accepted: 4374

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

Romania OI
2002

题意:求A ^ B的所有因子的和;

分析:对A用唯一分解定理分解 A = p1 ^ a1 * p2 ^ a2 * p3 ^ a3 ... * pn ^ an

其中A的因子的个数为 ( 1 + a1) * ( 1 + a2 ) * ( 1 + a3 ) * ... * ( 1 + an)

则A的所有因子的和为 (1 + p1 + p1 ^ 2 + p1 ^ 3 ... + p1 ^ a1) * ( 1 + p2 ^ 1 + p2 ^ 2 + p3 ^ 3 + ... + p2 ^ a2 ) * ... * ( 1 + pn + pn ^ 2 + ... + pn ^ an)

求  a + a ^ 2 + a ^ 3 + ... + a ^ n

如果n为奇数:  a + a ^ 2 + ... + a ^ (n / 2 )  + a ^ (n / 2 + 1) + ( a + a ^ 2 + ... + a ^ ( n / 2 ) ) *  a ^ ( n / 2 + 1)

如果n为偶数:  a + a ^ 2 + ... + a ^ (n / 2 ) + ( a + a ^ 2 + ... + a ^ ( n /. 2) ) * a ^ (n / 2)

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 #include <algorithm>
 5 using namespace std;
 6 typedef long long LL;
 7 const int Max = 10000;
 8 const int Mod = 9901;
 9 int prime[Max + 10],flag[Max],cnt;
10 void get_prime()
11 {
12     cnt = 0;
13     memset(flag, 0, sizeof(flag));
14     for(int i = 2; i <= Max; i++)
15     {
16         if(flag[i] == 0)
17         {
18             flag[i] = 1;
19             prime[++cnt] = i;
20             for(int j = i; j <= Max / i; j++)
21                 flag[i * j] = 1;
22         }
23     }
24 }
25 LL pow_mod(LL n, LL k)
26 {
27     LL res = 1;
28     while(k)
29     {
30         if(k & 1)
31             res = res * n % Mod;
32         n = n * n % Mod;
33         k >>= 1;
34     }
35     return res;
36 }
37 LL get_sum(LL n, LL m)
38 {
39     if(m == 0)
40         return 1;
41     if(m & 1)
42     {
43         return get_sum(n, m / 2) *( 1 + pow_mod(n, m / 2 + 1) ) % Mod;
44     }
45     else
46     {
47         return ( get_sum(n, m / 2 - 1) * (1 + pow_mod(n, m / 2 + 1)) % Mod + pow_mod(n, m / 2) ) % Mod;
48     }
49 }
50 int main()
51 {
52     LL a,b;
53     get_prime();
54     while(scanf("%I64d%I64d", &a, &b) != EOF)
55     {
56         LL ans = 1;
57         if(a == 0 && b) //特殊情况
58             ans = 0;
59         LL m;
60         for(int i = 1; i <= cnt; i++)
61         {
62             if(prime[i] > a)
63                 break;
64             m = 0;
65             if(a % prime[i] == 0)
66             {
67                 while(a % prime[i] == 0)
68                 {
69                     a = a / prime[i];
70                     m++;
71                 }
72                 m = m * b;  // m要设成LL,否则这里会溢出
73                 ans = ans * get_sum((LL)prime[i], m) % Mod;
74             }
75         }
76         if(a > 1)
77             ans = ans * get_sum(a, b) % Mod;
78         printf("%I64d\n", ans);
79     }
80     return 0;
81 }

时间: 2024-10-24 23:05:59

POJ1845Sumdiv(求所有因子和 + 唯一分解定理)的相关文章

uva 10375 唯一分解定理 筛法求素数【数论】

唯一分解理论的基本内容: 任意一个大于1的正整数都能表示成若干个质数的乘积,且表示的方法是唯一的.换句话说,一个数能被唯一地分解成质因数的乘积.因此这个定理又叫做唯一分解定理. 举个栗子:50=(2^1)*(5^2) 题目一般的思路就是要把素数表打出来,eg上面的例子 e={1,0,2,0,0......} 下面是两个题目,仅说说大致的思想: 题目一: E=(X1*X3*X4* ...*Xk)/X2   判断E是不是整数 如果把(X1*X3*X4* ...*Xk)分解成素数相乘,将X2也分解成素

hdu 1215 求约数和 唯一分解定理的基本运用

http://acm.hdu.edu.cn/showproblem.php?pid=1215 题意:求解小于n的所有因子和 利用数论的唯一分解定理. 若n = p1^e1 * p2^e2 * --*pn^en(任何一个数都可以分解成素数乘积) 则n的因子个数为  (1+e1)(1+e2)--(1+en) n的各个因子的和为(1+p1+p1^2+--+p1^e1)(1+p2+p2^2+--+p2^e2)--(1+pn+pn^2+--+pn^en) (把式子化简就知道为什么了) ac代码: #inc

【数论】Sumdiv(整数的唯一分解定理+约束和公式+递归求等比)

来源:https://blog.csdn.net/lyy289065406/article/details/6648539 题目描述 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). 输入 The only line contains the t

用唯一分解定理求m/n

用唯一分解定理求m/n,保证m能够被n整除: 这其中用到了素数筛以及快速幂 #include<bits/stdc++.h> using namespace std; const int maxn=1e4+5; bool vis[maxn]; int prime[maxn],cnt=0,e[maxn]; void getprime(){ for(int i=2;i<maxn;++i){ if(!vis[i])prime[++cnt]=i; for(int j=i*2;j<maxn;j

NOIP2009Hankson 的趣味题[唯一分解定理|暴力]

题目描述 Hanks 博士是 BT (Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫 Hankson.现 在,刚刚放学回家的 Hankson 正在思考一个有趣的问题. 今天在课堂上,老师讲解了如何求两个正整数 c1 和 c2 的最大公约数和最小公倍数.现 在 Hankson 认为自己已经熟练地掌握了这些知识,他开始思考一个“求公约数”和“求公 倍数”之类问题的“逆问题”,这个问题是这样的:已知正整数 a0,a1,b0,b1,设某未知正整 数 x 满足: 1. x 和 a0 的最大公约

LightOJ 1341 - Aladdin and the Flying Carpet (唯一分解定理 + 素数筛选)

http://lightoj.com/volume_showproblem.php?problem=1341 Aladdin and the Flying Carpet Time Limit:3000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu Submit Status Practice LightOJ 1341 Description It's said that Aladdin had to solve seven

hdu1215 正整数唯一分解定理应用

B - (例题)因子和 Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Description 七夕节那天,月老来到数字王国,他在城门上贴了一张告示,并且和数字王国的人们说:"你们想知道你们的另一半是谁吗?那就按照告示上的方法去找吧!" 人们纷纷来到告示前,都想知道谁才

1341 - Aladdin and the Flying Carpet ---light oj (唯一分解定理+素数筛选)

http://lightoj.com/volume_showproblem.php?problem=1341 题目大意: 给你矩形的面积(矩形的边长都是正整数),让你求最小的边大于等于b的矩形的个数. 什么叫唯一分解定理:算术基本定理可表述为:任何一个大于1的自然数 N,如果N不为质数,那么N可以唯一分解成有限个质数的乘积N=P1a1P2a2P3a3......Pnan,这里P1<P2<P3......<Pn均为质数,其中指数ai是正整数.这样的分解称为 N 的标准分解式 我们求出n的因

POJ 1845-Sumdiv(快速幂取模+整数唯一分解定理+约数和公式+同余模公式)

Sumdiv Time Limit:1000MS     Memory Limit:30000KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 1845 Appoint description:  System Crawler  (2015-05-27) Description Consider two natural numbers A and B. Let S be the sum of all natural d