Problem 2. power
Input file: power.in
Output file: power.out
Time limit: 1 second
Memory limit: 256 MB
Mr. Hu 打算考一道比较显然的题目,低头一想,就有了这道题。
Mr. Hu 需要你计算:
3n mod 109 + 8
是不是很简单啊。^_^
Input
只有一行,一个数n。
Output
输出结果。
Sample
power.in power.out
3 27
Note
• 对于10% 的数据,1 n 106
• 对于30% 的数据,1 n 1018
• 对于70% 的数据,1 n 101000
• 对于100% 的数据,1 n 10100000
2 power
2.1 10% 数据
暴力循环
2.2 30% 数据
普通二进制快速幂
2.3 70% 数据
高精度 + 二进制快速幂
2.4 100% 数据
十进制快速幂,类比二进制,从低到高维护好310i。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<set>
#include<queue>
#include<algorithm>
#include<vector>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<stack>
#define INF 2100000000
#define LL long long
#define clr(x) memset(x,0,sizeof(x))
#define ms(a,x) memset(x,a,sizeof(x))
#ifdef WIN32
#define AUTO "%I64d"
#else
#define AUTO "%lld"
#endif
using namespace std;
const int MOD = 1e9+8;
const int maxn = 100005;
char num[maxn];
int n[maxn];
int len;
template <class T> T powermod2(T a, T pos) {
if(pos == 1) return a;
T tmp = powermod2(a, pos>>1);
if(pos&1) return ((tmp*tmp)%MOD*a)%MOD;
return (tmp*tmp)%MOD;
}
LL pows[10];
LL powermod10(LL a, int* b, int pos) {
if(pos == 1) return pows[*b];
LL tmp = powermod10(a, b-1, pos-1);
tmp = powermod2(tmp, (LL)10);
return tmp*pows[*b]%MOD;
}
int main() {
freopen("power.in","r",stdin);
freopen("power.out","w",stdout);
scanf("%s",num); len = strlen(num);
for(int i = 0; i < len; i++) n[i] = num[i]-'0';
pows[0] = 1;
for(int i = 1; i < 10; i++) pows[i] = pows[i-1]*3%MOD;
printf(AUTO"\n",powermod10((LL)3, &n[len-1], len));
return 0;
}