HDU 1452 FZU 1053 Happy 2004(逆元函数+因子和函数+大指数取模化简公式)

Description

Consider a positive integer X,and let S be the sum of all positive integer divisors of 2004^X. Your job is to determine S modulo 29 (the rest of the division of S by 29).

Take X = 1 for an example. The positive integer divisors of 2004^1 are 1, 2, 3, 4, 6, 12, 167, 334, 501, 668, 1002 and 2004. Therefore S = 4704 and S modulo 29 is equal to 6.

Input

The input consists of several test cases. Each test case contains a line with the integer X (1 <= X <= 10000000).

A test case of X = 0 indicates the end of input, and should not be processed.

Output

For each test case, in a separate line, please output the result of S modulo 29.

Sample Input

1
10000
0

Sample Output

6
10


一个数的因子和是一个积性函数

关于积性函数,即F(ab)=F(a)*F(b),在数论里有很多积性函数

来证明一下:

S(x)表示x的因子和。

如果x可以分成a,b(一定为素数),那么S(x)=S(a)*S(b)。

为什么一定要分成素数呢,因为一个素数的因子之后1和它本身,对于a,b 来说,就是1,a,1,b,那么x=a*b,x的因子只有1,a,,b,x这四个数,

(1+a)*(1+b)=1+a+b+a*b。看明白了么,这就是所谓的一个数的因子和是一个积性函数。

(a*b)/c %M= a%M * b%M * inv(c)
其中inv(c)即满足 (c*inv(c))%M=1的最小整数

a^(b)%c----->a(b%k(c)+k(c))%c  (b>=k(c)) 其中k(c)为c的欧拉值。

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>

using namespace std;

typedef long long LL;

LL qpow(int x,int y){
    LL b = 1;
    for(;y;y>>=1){
        if(y&1) b = (b*x)%29;
        x=(x*x)%29;
    }b--;
    return b<0?b+29:b;
}

int main()
{
    int x;
    while(~scanf("%d",&x)&&x){
        LL a = 2*x+1;if(a>28) a%=28,a+=28;
        LL b = x+1;if(b>28) b%=28,b+=28;
        printf("%d\n",qpow(2,a)*qpow(3,b)*qpow(22,b)*9%29);
    }
    return 0;
}

  

时间: 2024-11-10 06:52:18

HDU 1452 FZU 1053 Happy 2004(逆元函数+因子和函数+大指数取模化简公式)的相关文章

HDU 5698 大组合数取模(逆元)

瞬间移动 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 1215    Accepted Submission(s): 600 Problem Description 有一个无限大的矩形,初始时你在左上角(即第一行第一列),每次你都可以选择一个右下方格子,并瞬移过去(如从下图中的红色格子能直接瞬移到蓝色格子),求到第n行第m列的格子有几

FZU 1759-Super A^B mod C(快速幂+大整数取模+欧拉函数)

题目链接:点击打开链接 题意:计算 a^b %c 但其中b很大,可能会达到10^1000000, 故有降幂公式 a^b %c= a^(b%phi(c)+phi(c)) %c  (b>=phi(c)) #include <algorithm> #include <iostream> #include <cstring> #include <cstdlib> #include <string> #include <cctype> #

hdu 5265 技巧题 O(nlogn)求n个数中两数相加取模的最大值

pog loves szh II Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 2106    Accepted Submission(s): 606 Problem Description Pog and Szh are playing games.There is a sequence with n numbers, Pog wi

fmod()函数 (对浮点数取模)

头文件:#include <math.h> fmod() 用来对浮点数进行取模(求余),其原型为:    double fmod (double x); 设返回值为 ret,那么 x = n * y + ret,其中 n 是整数,ret 和 x 有相同的符号,而且 ret 的绝对值小于 y 的绝对值.如果 x = 0,那么 ret = NaN. fmod 函数计算 x 除以 y 的 f 浮点余数,这样 x = i*y + f,其中 i 是整数,f 和 x 有相同的符号,而且 f 的绝对值小于

知识点:逆元求组合数取模

目标:求出C(n,m)%p 这里p是一个素数! 方法:费马小定理求逆元 因为膜的性质并不对除法适用,比如(a/b)%c; 但是,当我们知道了b%c的逆元d时,问题可以转化为:(a*d)%c=((a%c)*(b%c))%c; 考虑费马小定理: a^p-1=1(mod p) 显然有: a*a^p-2=1(mod p) 那么a^p-2就是a膜p意义下的逆元 利用快速幂即可求出! 然后我们需要预处理出m!,(n-m)!,分别对他们求出逆元,再与n!乘并取模即可! 原文地址:https://www.cnb

HDU 1452 Happy 2004(因子和的积性函数)

题目链接 题意 : 给你一个X,让你求出2004的X次方的所有因子之和,然后对29取余. 思路 : 原来这就是积性函数,点这里这里这里,这里讲得很详细. 在非数论的领域,积性函数指所有对于任何a,b都有性质f(ab)=f(a)f(b)的函数. 在数论中的积性函数:对于正整数n的一个算术函数 f(n),若f(1)=1,且当a,b互质时f(ab)=f(a)f(b),在数论上就称它为积性函数. 若对于某积性函数 f(n),就算a, b不互质,也有f(ab)=f(a)f(b),则称它为完全积性的. s(

hdu 1452 Happy 2004 (快速幂+取模乘法逆元)

Problem Description Consider a positive integer X,and let S be the sum of all positive integer divisors of 2004^X. Your job is to determine S modulo 29 (the rest of the division of S by 29).Take X = 1 for an example. The positive integer divisors of

HDU 1452 (约数和+乘法逆元)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1452 题目大意:求2004^X所有约数和,结果mod 29. 解题思路: ①整数唯一分解定理: 一个整数A一定能被分成:A=(P1^K1)*(P2^K2)*(P3^K3).....*(Pn^Kn)的形式.其中Pn为素数. 如2004=(22)*3*167. 那么2004x=(22x)*(3x)*(167x). ②约数和公式 对于一个已经被分解的整数A=(P1^K1)*(P2^K2)*(P3^K3)

HDU 1452 Happy 2004

题目意思:求2004^x的所有正因数的和对29求余 解析: 我们用s(x)表示x的因子和: 2的因子为1,2,s(2)=3; 3的因子为1,3,s(3)=4; 6的因子为1,2,3,6,s(6)=12; 可以发现:s(6)=s(2)*s(3)=3*4=12; 4的因子为1,2,4,,s(4)=7; 5的因子为1,5,s(5)=6; 20的因子为1,2,4,5,10,20,s(20)=42: 可以发现:s(20)=s(4)*s(5)=7*6=42; s(25)=1+5+25=31 再看s(50)=