题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=4704
题解:
先通过规律,可以知道答案就是2^(N-1),但是输入太大。这时候,我们就需要想一想了,看到了mod(1e9+7),可以想到费马小定理。但是输入还是有问题,这时候,需要使用同余定理了。
代码:
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define met(a,b) memset(a,b,sizeof(a))
#define inf 0x3f3f3f3f;
typedef long long ll;
const ll mod = 1e9+7;
ll fast_multi(ll m, ll n, ll mod)
{
ll ans = 0; while (n)
{
if (n & 1)
ans += m;
m = (m + m) % mod;
m %= mod;
ans %= mod;
n >>= 1;
}
return ans;
}
ll fast_pow(ll a, ll n, ll mod)
{
ll ans = 1;
while (n)
{
if (n & 1)
ans = fast_multi(ans, a, mod);
a = fast_multi(a, a, mod);
ans %= mod;
a %= mod;
n >>= 1;
}
return ans;
}
int main()
{
string s;
while(cin>>s)
{
ll num=0;
for(int i=0;i<s.size();i++)
num=(num*10+s[i]-'0')%(mod-1);
num--;
num=(num+mod-1)%(mod-1);
printf("%lld\n",fast_pow((ll)2, num, mod));
}
}
本文提供了一道 HDU 4704 的 ACM 题目解答,介绍了如何利用费马小定理和同余定理解决大数幂运算的问题,并给出了具体的 C++ 实现代码。
756

被折叠的 条评论
为什么被折叠?



