HDU 1452 Happy 2004 数论

  题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1452

  题目描述: 让你求2004^x的所有因数之和, 模29

  解题思路: 先将2014质因数分解, 2^2 * 3 * 167, 所以所有因数的个数就是(2x+1)*(x+1)*(x+1) , 我们列出公式, 相当于一个空间直角坐标系, 我们先将x, y平面上的点相加, 再加z轴上的, 最后得出公式

          ans = (3^(x+1)-1) * (167^(x+1)-1)*(2^(2*x+1)-1)/332   即可, 注意逆元

  代码:

#include <iostream>
#include <cstdio>
#include <string>
#include <vector>
#include <cstring>
#include <iterator>
#include <cmath>
#include <algorithm>
#include <stack>
#include <deque>
#include <map>
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
#define mem0(a) memset(a,0,sizeof(a))
#define sca(x) scanf("%d",&x)
#define de printf("=======\n")
typedef long long ll;
using namespace std;

const int mod = 29;
ll q_power( ll a, ll b ) {
    ll ret = 1;
    while( b ) {
        if( b & 1 ) ret = ret * a % mod;
        b >>= 1;
        a = a * a % mod;
    }
    return ret % mod;
}
ll exgcd(ll a, ll b, ll &x, ll &y) {
    if(b == 0) {
        x = 1;
        y = 0;
        return a;
    }
    else {
        ll ret = exgcd(b, a%b, x, y);
        ll tmp = x;
        x = y;
        y = tmp - a / b * y;
        return ret;
    }
}
ll inv(ll a) {
    ll x, y;
    exgcd(a, mod, x, y);
    return (x % mod + mod) % mod;
}
int main() {
    ll x;
    while( scanf( "%lld", &x ) == 1 && x ) {
        ll ans;
        ll a = q_power(3, x+1);
        ll b = q_power(167, x+1);
        ll c = q_power(2, 2*x+1);
        ans = (a*b*c-a*c-b*c+c-a*b+a+b-1) * inv(332) % mod;
        printf( "%lld\n", ans );
    }
    return 0;
}

  思考: 通过本题自己对逆元的理解也深了一些, 之前一直模棱两可的.......还有这种题都是有套路的, 题做多了就好了

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #ffffff }
span.s1 { }

a*b*c-a*c-b*c+c-a*b+a+b

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #ffffff }
span.s1 { }

a*b*c-a*c-b*c+c-a*b+a+b

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #ffffff }
span.s1 { }

a*b*c-a*c-b*c+c-a*b+a+b

时间: 2024-11-05 22:27:07

HDU 1452 Happy 2004 数论的相关文章

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 膜拜这推导过程

Happy 2004 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 920    Accepted Submission(s): 648 Problem Description Consider a positive integer X,and let S be the sum of all positive integer divis

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

HDU 1452 Happy 2004 求2004^n的所有因子和 积性函数应用

题目链接:点击打开链接 百度个题解:点击打开链接 6的因子是1,2,3,6; 6的因子和是 s(6)=1+2+3+6=12; 20的因子是1,2,4,5,10,20; 20的因子和是 s(20)=1+2+4+5+10+20=42; 2的因子是1,2; 2的因子和是 s(2)=1+2=3; 3的因子是1,3; 3的因子和是 s(3)=1+3=4; 4的因子和是 s(4)=1+2+4=7; 5的因子和是 s(5)=1+5=6; s(6)=s(2)*s(3)=3*4=12; s(20)=s(4)*s(

HDU 1452 Happy 2004(唯一分解定理)

题目链接:传送门 题意: 求2004^x的所有约数的和. 分析: 由唯一分解定理可知 x=p1^a1*p2^a2*...*pn^an 那么其约数和 sum = (p1^0+p1^1^-+p1^a1)*-* (pn^0+pn^1^-+pn ) 代码如下: #include <iostream> #include <cstring> #include <algorithm> #include <cstdio> using namespace std; const

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 4861 Couple doubi(数论)

HDU 4861 Couple doubi 题目链接 题意:给定k,p,有k个球,每个球的值为1^i+2^i+...+(p-1)^i (mod p) (1 <= i <= k),现在两人轮流取球,最后球的值总和大的人赢,问先手是否能赢 思路:先手不可能输,非赢即平,那么只要考虑每种球的值, 利用费马小定理或欧拉定理,很容易得到该函数的循环节为p - 1, 那么i如果为p - 1的倍数,即为循环节的位置,那么每个值都为1,总和为p - 1 如果i不在循环节的位置,任取一个原根g,根据原根的性质,

HDU 3049 Data Processing 数论题解

Problem Description Chinachen is a football fanatic, and his favorite football club is Juventus fc. In order to buy a ticket of Juv, he finds a part-time job in Professor Qu's lab. And now, Chinachen have received an arduous task--Data Processing. Th

HDU 4937 Lucky Number(数论)

HDU 4937 Lucky Number 题目链接 题意:给定一个数字,求它再x进制下,每位进制位上都只有3,4,5,6,求这样的x有多少种,如果无限种输出-1 思路:首先3 4 5 6特判掉是无限的,很容易想到就不证明了,然后就是枚举数字的最后一位3,4,5,6,然后进制数肯定来自这个数字的因子,因为剩下的数字肯定是a1x^1 + a2x^2 + a3x^3...这样的,这样只要在因子中找进制,去判断即可.找因子的方法用先分解再dfs找,直接试除会超时 代码: #include <cstdi