第一周poj1845

最初觉得是水题,后来认识到是大数据。抑郁的小火苗果断的燃烧了起来。。。尼玛居然有公式!!!现成的公式!可惜数学知识不太广泛。

这题需要的关于同余模公式和约数和公式实在是。。。太好用了。虽然我知道的不太早。

对于已经分解的整数A=(p1^k1)*(p2^k2)*(p3^k3)*....*(pn^kn)

    1.S = (1+p1+p1^2+p1^3+...p1^k1) * (1+p2+p2^2+p2^3+….p2^k2) * (1+p3+ p3^3+…+ p3^k3) * .... * (1+pn+pn^2+pn^3+...pn^kn)

    2.(a+b)%m=(a%m+b%m)%m                      (a*b)%m=(a%m*b%m)%m

然后事情就变得明朗起来了~~~得意

    整数分解掉然后再利用递归套公式以及计算公式.~


#include<stdio.h>
long long int ff(int x,long long int y)
{
    long long int g;
    if(y==1) return x;
    if(y==0) return 1;
    if(y%2==0)
    {
        g=ff(x,y/2)%9901;
        return g*g%9901;
    }
    else
    {
        g=ff(x,y/2)%9901;
        return ((g*g)%9901)*x%9901;
    }
}
long long int fg (int x,long long int y)
{
    long long int t,k1,k2;
    if(y==1)
         return (1+x)%9901;
    if(y==0)
         return 1;
    if(y%2==1)
         {
             t=(y+1)/2;
             k1=(ff(x,t)+1)%9901;
             k2=fg(x,t-1)%9901;
             return k1*k2%9901;
         }
    else
    {
        k1=ff(x,y)%9901;
        k2=fg(x,y-1)%9901;
        return (k1+k2)%9901;
    }
}
int main()
{
    int n,m,i,s,x,t,j,a[10010],b[10000];
    long long int y,g;
    scanf("%d%d",&n,&m);
    for(i=1;i<=10000;i++)
        a[i]=0;
    a[1]=1;
    for(i=2;i<=10000;i++)
    if (a[i]==0)
        {
             for(j=2;j<=10000/i;j++)
             a[i*j]=1;
        }
     t=0;
     for(i=1;i<=10000;i++)
     if(a[i]==0)  b[++t]=i;
     s=1;
     for(i=1;i<=t;i++)
         if(n%b[i]==0)
         {
             x=b[i];
             y=0;
             while(1)
             {
                  if (n%x==0) {n=n/x;y++;}
                  else break;
             }
             g=fg(x,y*m)%9901;
             s=s*g%9901;
         }
         if (n!=1)
         {
             s=s*fg(n,m)%9901;
         }
         printf("%d\n",s);
     return 0;
}


    搞定。敲完。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值