zoukankan      html  css  js  c++  java
  • poj 1845 Sumdiv

    Sumdiv
    Time Limit: 1000MS   Memory Limit: 30000K
    Total Submissions: 11880   Accepted: 2852

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

    参考思路:http://blog.csdn.net/lyy289065406/article/details/6648539

    #include<stdio.h>
    #include<math.h>
    #include<string.h>
    #define MOD 9901
    long long p[100000],ans[100000];
    long long Pow1(long long p,long long n)//计算p的n次方的函数,不能直接用pow函数
    {
      /*   long long temp=p;//开始直接用循环,超时;
         int i;
         for(i=0;i<n-1;i++)
        temp=(temp%MOD*p%MOD)%MOD;
    
              //printf("temp=%lld
    ",temp);
     return temp;*/
    long long  ret=1,s=p;//快速幂算法
        while(n)
        {
            if(n&1)
                ret=(ret%MOD*s%MOD)%MOD;
            if(n>>=1)
                s=(s%MOD*s%MOD)%MOD;
            else
                break;
        }
        return ret;
    }
    long long  Sum(long long  p,long long   n)//二分求等比数列的和
    {
         if(n==0)
         return 1;
         else if(n%2!=0)
         return (((1+Pow1(p,n/2+1)%MOD))*(Sum(p,n/2))%MOD)%MOD;//两个公式,可以自己推下
         else
         return (((1+Pow1(p,n/2+1)%MOD)*(Sum(p,(n/2-1)))%MOD)+(Pow1(p,n/2))%MOD)%MOD;
    }
    int main()
    {
         long long i,j,k,cnt,sum;
         int A,B;
         //freopen("in.txt","r",stdin);
         //freopen("out.txt","w",stdout);
        while(scanf("%d %d",&A,&B)!=EOF)
         {
              memset(ans,0,sizeof(ans));
                memset(p,0,sizeof(p));
                sum=1;
              k=0;
              for(i=2;i<=sqrt(A);i++)//把A分解
              {
                   cnt=0;
                   while(A%i==0)
                   {
    
                        p[k]=i;
                        ans[k]++;
                        cnt=1;
                        A/=i;
                   }
                   if(cnt)
                   k++;
              }
              /*
               if(A!=1)//这里很重要,我开始只考虑这个数是单个质数的情况,也就是A=13这种情况,
               {
               p[0]=A;//WA了几次,还有一种情况就是A=13*17这种如果我这样做的话,13的话就被覆盖了
               ans[0]=1;
               k=1;
               }*/
              if(A!=1)
              {
                   p[k]=A;
                   ans[k]+=1;
                   k++;
              }
              for(j=0;j<k;j++)
              {
    
                    sum=(sum%MOD*Sum(p[j],ans[j]*B)%MOD)%MOD;
    
              }
    
              printf("%lld
    ",sum%MOD);
         }
    
         return 0;
    }
  • 相关阅读:
    Java Collection知识总结
    Java异常总结
    关于触发器
    关于事务
    git分支的创建、删除、切换、合并
    github项目上传管理
    如何在github上下载单个文件夹?
    常见的javascript跨站
    各类常用端口漏洞缺陷
    SEO优化实践操作
  • 原文地址:https://www.cnblogs.com/llei1573/p/3218979.html
Copyright © 2011-2022 走看看