Problem . 2
Input file: power.in
Output file: power.out
Time limit: 1 second
Memory limit: 256 MB
Mr. Ding 打算考一道比较显然的题目,低头一想,就有了这道题。
Mr. Ding 需要你计算:
3^n mod 10^9 + 8
是不是很简单啊。^_^
Input
只有一行,一个数n。
Output
输出结果。
Sample
input
3
output
27
Note
? 对于10% 的数据,1 <= n <= 10^6
? 对于30% 的数据,1 <= n <=10^18
? 对于70% 的数据,1 <= n <= 10^1000
? 对于100% 的数据,1 <= n <= 10^100000
题解 :
我们看到这道题的数据,非常大,所以单纯的乘或者二进制快速幂是不可能过的,所以我们需要使用十进制快速幂,类比二进制快速幂来学习
代码 :
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> using namespace std; const long long M=1e9+8; long long mpow(long long a,int p){//快速幂,类比二进制快速幂 long long rt=1; for (;p;p>>=1,a=a*a%M) if (p&1) rt=rt*a%M; return (rt%M+M)%M; } int main(){ freopen("power.in","r",stdin); freopen("power.out","w",stdout); string s1,s; cin>>s1; s.resize(s1.size());//教训:string类型一开始没有空间,要去访问其空间要先创设出来 ,否则程序会崩溃 int n=s1.size(); for (int i=n-1;i>=0;i--) s[n-1-i]=s1[i]; long long cur=1; long long base=3;//base存的是3^(10^i) for (int i=0;i<n;i++){ cur=cur*mpow(base,s[i]-‘0‘)%M; base=mpow(base,10); } printf("%I64d",cur); return 0; }