zoukankan      html  css  js  c++  java
  • ACM: Happy 2004-数论专题-因子求和-快速幂

    Happy 2004
    Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

    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

    /*/
        题意:
        求2004^x的所有的因子和然后 mod 29。
    
        一开始没有头绪,后面百度了下,N的因子和是积性函数,所以就开始用积性函数的方法解题。
    
        积性函数 : 当gcd(a,b)=1时 s(a*b)=s(a)*s(b);
    如果p是素数[或素数取X模后的数] s(p^n)=1+p+p^2+...+p^n= (p^(n+1)-1) /(p-1) /
    */ /*/ 2004=2*2*3*167 质因子 /*/ /*/ σ(2004^x)=σ(2^2x)*σ(3^x)*σ(167^x) mod 29 积性函数。 /*/ /*/ 167%29 = 22 /*/ /*/ σ(2004^x)=σ(2^2x)*σ(3^x)*σ(22^x) mod 29 /*/ /*/ σ(2^2x)= (2^(2x+1)-1)/(2-1)=(2^(2x+1)-1)/1 /*/ /*/ σ(3^x) = (3^(x+1)-1)/(3-1) =(3^(x+1)-1) /2 /*/ /*/ σ(22^x)=(22^(x+1)-1)/(22-1)=(22^(x+1)-1)/21 /*/ /*/ σ(2004^x)=(2^(2x+1)-1)*(3^(x+1)-1)/2*(22^(x+1)-1)/21 /*/ /*/ 1/2 对于29的逆元x=15 1=2*15 -29*1 /*/ /*/ 1/21对于29的逆元x=18 1=21*18-29*13 /*/ /*/ σ(2004^x)=((2^(2x+1)-1)*(3^(x+1)-1)*15*(22^(x+1)-1)*18)%29 /*/ /*/ 然后开始用快速幂求解。 /*/ /*/ 这个题目的重点在在于这个数学推导过程。 /*/ // AC代码:
    #include"cmath"
    #include"string"
    #include"cstdio"
    #include"cstring"
    #include"iostream"
    #include"algorithm"
    using namespace std;
    typedef long long LL;
    
    LL mod_pow(LL x,LL y,LL p) {
    	LL rt=1;
    	LL t=x;
    	while(y) {
    		if(y&1)rt=(rt*t)%p;
    		t=t*t%p;
    		y>>=1;
    	}
    	return rt;
    }
    
    int main() {
    	LL x,ans;
    	while(~scanf("%I64d",&x)) {
    		if(x==0)break;
    		/*/ σ(2004^x)=((2^(2x+1)-1)*(3^(x+1)-1)*15*(22^(x+1)-1)*18)%29 /*/
    		ans=1;
    		ans*=(mod_pow(2,2*x+1,29)-1)%29;
    		ans*=(mod_pow(3,x+1,29)-1)*15%29;
    		ans*=(mod_pow(22,x+1,29)-1)*18%29;
    		printf("%I64d
    ",ans%29);
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    结对编程实验(1李晓冬13、张金伟118)
    软件工程网络15个人阅读2(201521123118张金伟)
    软件工程网络15个人作业阅读1(201521123118 张金伟)
    《Java课程设计》
    201521123118《java与程序设计》第14周学习总结
    201521123118《程序与设计》第13周学习总结
    201521123118《程序与设计》第12周学习总结
    网络15软工个人作业5——软件工程总结
    个人作业4——alpha阶段个人总结
    软工网络15个人作业3——案例分析
  • 原文地址:https://www.cnblogs.com/HDMaxfun/p/5727214.html
Copyright © 2011-2022 走看看