zoukankan      html  css  js  c++  java
  • POJ 1845, Sumdiv

    Time Limit: 1000MS  Memory Limit: 30000K
    Total Submissions: 4943  Accepted: 1047


    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


    // POJ1845.cpp : Defines the entry point for the console application.


    #include 
    <iostream>
    using namespace std;

    #define M 9901
    #define MAX 10000
    long long pow(long long x,long long n)
    {
        
    long long ret=1,s=x;
        
    while (true)
        {
            
    if (n & 1) ret = ((ret % M) * (s % M)) % M;
            
    if (n>>=1) s = ((s % M) * (s % M)) % M;
            
    else break;
        }
        
    return ret;
    }

    long long sum(long long p,long long n)
    {
        
    if(n == 0)
            
    return 1;
        
    if(n & 1)
            
    return (((1+pow(p,n/2+1)) % M) * (sum(p,n/2% M)) % M;
        
    else
            
    return (((1+pow(p,n/2+1)) % M) * (sum(p,(n-1)/2% M) + pow(p,n/2% M) % M;
    }

    int main(int argc, char* argv[])
    {
        
    int A,B;
        
    int p[MAX],c[MAX];

        memset(p, 
    0sizeof(p));
        memset(c, 
    0sizeof(c));

        cin
    >>A>>B;
        
    for(int i = 2;i * i <= A;++i)
        {
            
    if(A % i == 0)
            {
                p[
    ++p[0]] = i;
                
    while(A % i == 0)
                {    
                    A 
    /= i;
                    
    ++c[p[0]];
                }
            }
        }

        
    if(A != 1)
        {
            p[
    ++p[0]] = A;
            c[p[
    0]] = 1;
        }
        
    long long res=1;
        
    for(int i = 1;i <= p[0]; ++i)
        {
            res 
    = ((res % M) * (sum(p[i],B * c[i]) % M)) % M;
        }
        cout
    <<res<<endl;
        
    return 0;
    }

  • 相关阅读:
    【BZOJ1396】识别子串
    【BZOJ3309】DZY Loves Math
    【XSY3306】alpha
    整体二分
    常系数齐次线性递推
    【XSY2968】线性代数
    【XSY2892】【GDSOI2018】谁是冠军
    【BZOJ5020】[LOJ2289]【THUWC2017】在美妙的数学王国中畅游
    【XSY2989】字符串
    【XSY2988】取石子
  • 原文地址:https://www.cnblogs.com/asuran/p/1588960.html
Copyright © 2011-2022 走看看