【十进制快速幂】【高精度】Number Theory Special Training T2 power 题解

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值