题目:
由题目推出计算公式:
ans = (2^(n-1) + 1) % n
因为n取值很大,所以需要用到快速幂取模:
int multi(int a,int b)
{
int ret;
ret=1;
while(b>0)
{
if(b&1)
ret=(ret*a)%mod;
a=(a*a)%mod;
b>>=1;
}
return ret;
}
b&1即将b转换为二进制数,然后从右边第一位开始与1取与运算,判断是否乘一倍数a,然后将a*a相当于二分了原来的乘法。再将b往右移动一位 (相当于除以2),这样以logb的时间复杂度计算a^b。
AC 代码:
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
long long int mod;
long long int multi ( long long int a, long long int b )
{
long long int ret;
ret = 1;
while(b>0)
{
if(b&1)
ret = (ret*a)%mod;
a = (a*a)%mod;
b>>=1;
}
return ret;
}
int main()
{
long long int N;
while (scanf("%lld", &N) && N)
{
mod = N;
long long int ans = (multi(2, N-1) + 1)%N ;
cout << ans << endl;
}
}