杭电3003

题意:PuPu有n层皮肤,每层皮肤都有2种状态:透明和不透明,每层皮肤如果能被太阳照射到,则被太阳照射一天后都会变换状态。PuPu在出生的时候,所有的皮肤都为不透明的,直到每一层的皮肤都有过变为透明状态的时候,PuPu也就长大了。问有n层皮肤的PuPu几天后能长大。

 

思路:数论。公式推导到最后为 ans = (2^(n-1)+1)%n。所以就用求(num^exp)%MOD的二分算法了,让时间复杂度为0(n)变为0(logn)。

 

#include<stdio.h>
__int64 n;

__int64 a_b_Mod_c(__int64 a, __int64 b, __int64 c)
   {
    int digit[64];                  
    int i, k;
 __int64 result = 1;         
    i = 0;
    while(b)
    {
        digit[i++] = b%2; //记下每次二分的状态!0 表示 x^2n=x^n * x^n  1表示x^(2n+1)=x^n * x^n * x;
        b >>= 1;
    }
    for(k = i-1; k >= 0; k--)
    {
        result = (result * result) % c;                
        if(digit[k] == 1)  //根据二分的结果来算!
        {
            result = (result * a) % c;                 
        }
    }
    return result;
}
main()
{
 __int64 d;
 while(scanf("%I64d",&n),n)
 {
 d=a_b_Mod_c(2,n-1,n)+1;
 printf("%I64d\n",d%n);
 }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值