Chinaunix首页 | 论坛 | 博客
  • 博客访问: 592594
  • 博文数量: 197
  • 博客积分: 7001
  • 博客等级: 大校
  • 技术积分: 2155
  • 用 户 组: 普通用户
  • 注册时间: 2005-02-24 00:29
文章分类

全部博文(197)

文章存档

2022年(1)

2019年(2)

2015年(1)

2012年(100)

2011年(69)

2010年(14)

2007年(3)

2005年(7)

分类: C/C++

2012-02-23 08:52:44



一分析发现就是求 (d*(b^n-1)/(b-1)) MOD m
因为m很大(a%m*b%m可能大于2^64),二分快速幂里面的乘法还要特殊处理一下。


#include
#include
using namespace std;
typedef unsigned long long LL;

//typedef  long LL;
LL mmod(LL a,LL b,LL n)  
{  
    a=a%n;  
    LL res=0;  
    while(b)  
    {  
        if(b&1)  
        {  
            res=res+a;  
            if(res>=n)  
                res=res-n;  
        }  
        a=a<<1;  
        if(a>=n)  
            a=a-n;  
        b=b>>1;  
    }  
    return res;  
}  
 
LL exmod(LL a,LL b,LL n)  
{  
    a=a%n;  
    LL res=1;  
    while(b>=1)  
    {  
        if(b&1)  
            res=mmod(res,a,n);  
        a=mmod(a,a,n);  
        b=b>>1;  
    }  
    return res;  
}  

LL same(LL n, LL b, LL d, LL m)
{
    LL res=exmod(b,n,(b-1)*m);
    //printf("%lld %lld %lld %lld %lld\n", n, b, d, m, res);
    if(res==0)
        res+=(b-1)*m-1;
    else
        res-=1;
    res/=(b-1);
    res=(res*d)%m;
    return res;
}

int main()
{
    int T,cas=1;
    scanf("%d",&T);
    while (T--)
    {
        LL n,b,d,m;
        scanf("%lld%ld%ld%ld",&n,&b,&d,&m);
        printf("Case %d: %lld\n",cas++,same(n,b,d,m));    
        
    }
    return 0;
}

阅读(1275) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~